2016-07-05 4 views
1

紛らわしいタイトルに申し訳ありません。私は、次のReactの匿名関数で、自分のonClick属性の関数をラップする必要があるのはなぜですか?

<Component onClick={this.doSomething()} /> 

としての私の構成要素の一つにonClick属性を持っている場合、私は多くの場合、doSomethingの()関数が実際に呼んでいるものに応じて変なエラーが発生します。 doSomething()が状態を特に変更している場合は、あらゆる種類のレンダリングエラーが発生します。一方、私がこれを行うと、

var _this = this; 
<Component onClick{ 
    function(){ 
     _this.doSomething() 
    } 
} /> 

すべてのエラーが消えて、すべてが私の意図どおりに動作します。私のonClickアトリビュートを無名関数にラップして正確に何をしていますか?私がやろうとしていることをやるより良い方法がありますか?あなたがこれを行う場合は

+0

あなたは 'onClick = {_this.doSomething}'を行うことができます – Rajesh

+2

@Rajeshいつもそうではありません。 'this.doSomething.bind(this) 'も必要になる可能性があります。 –

+0

@BenFortuneはい、あなたは正しいです。私たちはそれをしなければならないかもしれません。 – Rajesh

答えて

9

<Component onClick={this.doSomething()} /> 

は、その後、あなたは 関数を呼び出すと onClick属性に戻り値を代入しています。 this.doSomething()がレンダリング中にコンポーネントの状態を変更すると、問題が発生します。

あなたが使用することができなければならない:関数はなく関数の実行結果より、属性に割り当てるよう

<Component onClick={this.doSomething} /> 

すなわち、()を除去します。

this.doSomething = this.doSomething.bind(this); 

あなたもonClick={this.doSomething.bind(this)}を使用することができますが、これは新しい機能は、コンポーネントが再レンダリングされるたびに作成されることを意味します。あなたのコンポーネントクラスのコンストラクタで

は、次の行を含める必要があります。 thisは、 thisが自動的 React.createClassを使用
  • に結合されていない、

    • classキーワード(ES6)を使用して:

      コンポーネントクラス内thisの結合挙動は、コンポーネントが作成される方法に応じて、変化しますバインド

    ES7では、さらに2つのオプションがあります。

    • 代わりにonClick={::this.doSomething}を使用してfunctionキーワード
    • doSomething =() => { //...を使用して、簡単な方法は、その耐用コメントをZequezthis

    感謝をバインドします。

  • +2

    あなたが 'createClass'に反応しているのなら、そうです。 ES6クラスを使用している場合はそうではありません。ただし、ES7を使用している場合は、classMethod =()=> {} 'の代わりに' classMethod =(){} 'を使用してクラスメソッドをプロパティとして定義することができ、自動的にバインドされるか、 :this.doSomething'は '.bind(this)'の省略形です。 – Zequez

    +0

    私は二重コロン構文について知らなかった。ありがとう! –

    +0

    Thanks @ Zequez、あなたのコメントの詳細を含めるように私の答えを更新しました。 –

    関連する問題