ES6 React でバインディングを処理するさまざまな方法について書かれた多くの質問/記事がありますが、ほとんどはReact docs (強調鉱山)で概説されている問題に対処していないようです:
コンストラクターでイベント ハンドラーをバインドして 、インスタンスごとに 1 回だけバインドすることをお勧めします。
constructor(props) { super(props); this.state = {count: props.initialCount}; this.tick = this.tick.bind(this); }
文脈上、彼らは次のようなメソッドのインラインバインディングに反対するようアドバイスしています:
//using .bind()
<div onClick={this.tick.bind(this)}>
// ES6 anon arrow functions
<div onClick={() => this.tick()}>
// ES.Next :: operator
<div onClick={::this.tick}>
もちろん。しかし、コンストラクター内のすべてのメソッドをバインドするという推奨される解決策は、多くのメソッドで面倒なので 、単純な解決策としてクラス レベルでES.Next @autobind デコレーターを検討していました。
import { autobind } from 'core-decorators';
@autobind
class Person {
getPerson() {
return this;
}
getPersonAgain() {
return this;
}
}
let person = new Person();
let { getPerson, getPersonAgain } = person;
getPerson() === person;
// true
getPersonAgain() === person;
// true
私が理解できないのは、このデコレーターにはインラインバインディングメソッドと同じ欠点がありますか? つまり、メソッドはインスタンスごとに 1 回だけバインドされますか?
そうでない場合、この落とし穴を回避する簡潔な解決策はありますか?