2017-07-20 8 views
0

なぜthis.click = this.click.bind(this)が必要なのか、何をしているのか分かりません。「これ」を反応成分法に結合する方法

class MyComponent extends React.Component { 
     constructor(props) { 
      super(props); 
      this.state = { 
       name: 'Initial State' 
      }; 
      this.click = this.click.bind(this); 
     } 
     click() { 
      this.setState({ 
       name: 'React Rocks!' 
      }); 
     } 
     render() { 
     return (
      <div> 
      <button onClick = {this.click}>Click Me</button> 
      <h1>{this.state.name}</h1> 
      </div> 
     ); 
     } 
    }; 

答えて

4

をあなたthis.click()は、イベントリスナーから呼び出された使用bind()をしなかった場合は、thisの値ははあなたではないでしょう反応成分(stateおよびpropsなどがある)が代わりにthisであると、this.click()となる。通常、関数が呼び出されるたびに、実行コンテキスト(値)が関数自体に設定されます。

もちろん、あなたがReactコンポーネントのコンテキストにアクセスしたい場合、それはあまり良いことではありません。 bind()は、コンポーネントの同じ実行コンテキストで機能が確実に実行されるようにする手段の1つで、関数内でthis.statethis.propsなどにアクセスできます。もう一つの方法は、ES6矢印関数の宣言を使用することです:。

let foo =() => {console.log("bar")} 

自動的に関数がで宣言されたものは何でもコンテキストにfooためthisの値を設定し、あなたがコンポーネントを反応させるのと同じ文脈でfooを宣言すると、それはそのコンテキストを保持するので、thisの値がfooと同じになるようにします。

+2

私はちょうどes6の矢印関数について何か指摘したいと思います...あなたは 'render()'メソッドの中で人々が 'onClick = {()=> {_function_body_}}'宣言している例をたくさん見るでしょう。すべてのレンダー呼び出しで関数を再定義することでパフォーマンスが低下するため、この作業を行わないでください。これは@jeredがちょうどbtwを示唆しているものではありません。 –

+0

コード内のClick()関数が "this"を使用していなかった場合、バインドは必要ありません。 – Sid24

+1

@ Sid24それは正しいです。たとえば、関数が引数をとり、結果を返し、コンポーネントの状態、小道具、関数にアクセスする必要がない場合は、バインドする必要はありません。 – jered

2

コールバック関数が異なるcontextと呼ばれているので、あなたはそれを行う必要があります。 .bind(this)を実行することにより、コンポーネントが常にコンポーネントと同じthiscontextで呼び出されるようにします。

Editted:per @ jeredのコメント。

+0

機能が矢印機能の場合は、 '.bind(this)'を使用する必要はありません。 – cssko

+0

あなたはほとんど正しいですが、私たちが 'this'について話しているときは_scope_ではなく_context_について話しています。文脈と範囲は(関連していても)異なっていますが、しばしばお互いに混乱します。私はそれを区別することが重要だと思います。 'bind()'は結果として得られる関数のレキシカルスコープを変更せず、そのコンテキストのみを変更します。 – jered

1

click()関数を呼び出すと、この関数がなければ未定義になります。反応文書から...

JSXコールバックでは、この意味に注意する必要があります。 JavaScriptでは、クラスメソッドはデフォルトではバインドされていません。 this.handleClickをバインドしてonClickに渡すことを忘れた場合は、関数が実際に呼び出されたときには未定義の になります。

ここでいくつかの詳細は、ドキュメントをチェックアウト:https://facebook.github.io/react/docs/handling-events.html

2

クラスメソッドがデフォルトでバインドされていないため、React Documentationへのアコーディングが必要です。また、バインドせずにイベントハンドラにコールバックを渡すと、 'this'は定義されません。

あなたのコールバックをバインドするプロパティ初期化子を使用することができます。

class MyComponent extends React.Component { 
 
    constructor(props) { 
 
     super(props); 
 
     this.state = { 
 
      name: 'Initial State' 
 
     }; 
 
    } 
 
    handleClick() { 
 
     this.setState({ 
 
      name: 'React Rocks!' 
 
     }); 
 
    } 
 
    render() { 
 
     return (
 
      <div> 
 
      <button onClick = {() => this.handleClick()}>Click Me</button> 
 
      <h1>{this.state.name}</h1> 
 
      </div> 
 
    ); 
 
    } 
 
};
:あなたはまた、コールバックで 矢印機能を使用することができます

class MyComponent extends React.Component { 
 
    constructor(props) { 
 
     super(props); 
 
     this.state = { 
 
      name: 'Initial State' 
 
     }; 
 
    } 
 
    handleClick =() => { 
 
     this.setState({ 
 
      name: 'React Rocks!' 
 
     }); 
 
    } 
 
    render() { 
 
     return (
 
      <div> 
 
      <button onClick = {this.handleClick}>Click Me</button> 
 
      <h1>{this.state.name}</h1> 
 
      </div> 
 
    ); 
 
    } 
 
};

関連する問題