the problem seems simple, but I can't figure out how to solve it:
render-Function works just finestate itself doesn't work. As the code already mentions, it will throw the "TypeError: Cannot read property 'state' of undefined"-Errorclass App extends Component {
constructor() {
super();
this.state = {
someArrayOfObjects: [{
attr:
// SNIP ...
// Doesn't work!
// When clicked leads to this error: "TypeError: Cannot read property 'state' of undefined"
<button onClick={this.doAction}>Add</button>
// SNIP ...
}]
};
this.doAction = this.doAction.bind(this);
}
// SNIP ...
doAction() {
console.log(this.state);
}
render() {
return(
// SNIP...
// Works just fine
<button onClick={this.doAction}>Add</button>
)
}
}
What am I missing out?
You need to bind the function doAction before the state
constructor() {
super();
this.doAction = this.doAction.bind(this);
this.state = {
someArrayOfObjects: [{
attr:
// SNIP ...
// Doesn't work!
// When clicked leads to this error: "TypeError: Cannot read property 'state' of undefined"
<button onClick={this.doAction}>Add</button>
// SNIP ...
}]
};
}
Edit:
You need to bind the function before the state creation. At the point at which you are creating the button in the state, this.doAction refers to the prototype method of the component class. But you can't pass a method as a callback directly, so you need to bind it. Function.prototype.bind creates a new function, which you then assign to the instance being created in the constructor:
this.doAction = this.doAction.bind(this);
So, perhaps confusingly, this.doAction refers to two different functions at different points in the code. You want to pass the bound version to the handler (see link above for why), so you need to bind it before creating that button.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With