2

I have that pass Bind in setState, how to do? enter image description here

TypeError: Cannot read property 'setState' of undefined

I am using the RealTime Firebase and ReactJs

constructor() {
    super()
    this.app = firebase.initializeApp(firebase_config);
    this.database = this.app.database().ref().child('users');
    this.state = {
        users: []
    }
}
componentDidMount() {
  this.database.once("value", function(snapshot) {
      snapshot.forEach(function(data) {
          this.setState({users: data.val()})
      })
  });
}

render() {
   return (
    <BrowserRouter>
       <div className="App">
          <Navbar/>
          <Switch>
            <Route exact="exact" path='/' component={CampaingListClients}/>
          </Switch>
          <p>{this.state.users}</p>
       </div>
    </BrowserRouter>);
    }
}

TypeError: Cannot read property 'setState' of undefined

  • 1
    the `this` in `this.setState` binds to the inner function and not the React component. – paqash Feb 10 '19 at 11:23
  • Possible duplicate of [How does the "this" keyword work?](https://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work) – Francisco Feb 10 '19 at 12:26
  • This isn't a duplicate of how does "this" keyword work because this question is about react vs. general javascript. – DeltaFlyer Feb 27 '19 at 01:39

1 Answers1

2

You can resolve setState undefined issue in two ways

  1. Change your functions to arrow functions

    componentDidMount() {
        this.database.once("value", snapshot => {
           snapshot.forEach(data => {
              this.setState({users: data.val()})
           })
        });
     }
    
  2. Bind each function like below

      componentDidMount() {
         this.database.once("value", function(snapshot) {
             snapshot.forEach(function(data) {
                 this.setState({users: data.val()})
             }.bind(this)}
         }.bind(this));
       }
    
Hemadri Dasari
  • 23,970
  • 25
  • 87
  • 133