Вам необходимо связать функцию doAction
до 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 ...
}]
};
}
Редактировать : Вам необходимо связать функцию перед созданием состояния. В момент, когда вы создаете кнопку в состоянии, this.doAction
ссылается на метод-прототип класса компонента. Но вы не можете передать метод в качестве обратного вызова напрямую , поэтому вам нужно связать его. Function.prototype.bind
создает новую функцию , которую вы затем назначаете экземпляру, который создается в конструкторе:
this.doAction = this.doAction.bind(this);
Так что, возможно, сбивает с толку, this.doAction
относится к двум различным функциям в разных точках кода. Вы хотите передать связанную версию обработчику (см. Ссылку выше, чтобы узнать, почему), поэтому вам нужно связать ее перед созданием этой кнопки.