'ReactJs this.setState is not a function

I'm trying to change the value of a this.state.id with an <input> tag value, when I click on a <a> tag as follows:

 {this.state.json[1].map(i => (
    <tr>
        <td>{i.cin}</td>
        <td>{i.nom}</td>
        <td>{i.prenom}</td>
        <td>
             <a onClick={() => this.state.click(i.id)} >
                   <input value={i.id} hidden></input>
                   Create a New Folder
             </a>
        </td>
    </tr>
  ))}

but the console says this.setState is not a function. This is my component:

    constructor(props)
{
    super(props);
    this.state = {
      json:JSON.parse(props.data),//data received from a laravel controller used to 
      implement the page.
      objet: '',
      id: '',
      click: function(id){
          var a = id;//a is an integer 
          alert('hitting waypoint 1');//clear hit
          this.setState({//error
          id: a,
          }).bind(this);
          alert('hitting waypoint 2');//not alerting
          alert("id = " + this.state.id)//not alerting
      }
    };
    this.onChangeValue = this.onChangeValue.bind(this);
    this.onSubmitButton = this.onSubmitButton.bind(this);     
}


Solution 1:[1]

I think the larger issue here is that you should probably not have this function within your component's state. If you declare it similar to your other handlers (onChangeValue and onSubmitButton) and bind like you did in the constructor, the function will probably work correctly.

If, however, you wish to keep the function inside state, changing it to an arrow function will probably solve the issue. Also, as a best practice, you should change the use of var to let or const.

Your improved function could look like this:

click: (id) => {
    const a = id;
    alert('hitting waypoint 1');
    this.setState({
        id: a,
    });
    alert('hitting waypoint 2');
    alert("id = " + this.state.id);
}

As an aside, setState is asynchronous, so the last alert (this.state.id) may not return what you think it will. If you want to use the new id directly after you set it, you should use the const a from earlier to guarantee that it has the correct value. Using state is (generally) better left to the render function.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Chris Gilardi