2016-09-25 4 views
1

私はReactを学習しています。私が書いているテストアプリでは、onClickメソッドでいくつかのボタンをレンダリングしています。このようにレンダリングされると、クリックされたときにselectMode関数が正常に動作し、呼び出されます。Reactコンポーネントのイベントハンドラをバインドすると、レンダリング時にonClickが発生する

constructor(props) { 
    super(props); 
    this.state = { mode: 'commits', commits: [], forks: [], pulls: [] }; 
}  
... 
selectMode(mode) { 
    this.setState({ mode }); 
}  

render() { 
... 
return (<div>     
     <button onClick={this.selectMode.bind(this, 'commits')}>Show Commits</button><br/> 
     <button onClick={this.selectMode.bind(this, 'forks')}>Show Forks</button><br/> 
     <button onClick={this.selectMode.bind(this, 'pulls')}>Show Pulls</button> 
     </div> 
     ) 
} 

しかし、私は道コンストラクタで結合することによって、以下に示す提案のベストプラクティスをしようとしたときにコンポーネントがレンダリングされるときに、のselectMode機能は3回呼び出されます。なぜonClickイベントハンドラが呼び出されているのですか?何が間違っていますか?

constructor(props) { 
    super(props); 
    this.state = { mode: 'commits', commits: [], forks: [], pulls: [] }; 
    this.selectMode = this.selectMode.bind(this) 
} 
... 
selectMode(mode) { 
    this.setState({ mode }); 
} 

render() { 
... 
return (<div>     
     <button onClick={this.selectMode('commits')}>Show Commits</button><br/> 
     <button onClick={this.selectMode('forks')}>Show Forks</button><br/> 
     <button onClick={this.selectMode('pulls')}>Show Pulls</button> 
     </div> 
     ) 
} 

答えて

3

あなたthis.selectMode(...)コンポーネントがレンダリングされるたびに即座に実行されます。

<.. onClick={this.selectMode('commits')}..../> <-- function is called immediately 

arrow functionを使用して、メソッドを呼び出すことができる無名関数を作成できます。あなたは毎回あなたがコンポーネントをレンダリングする無名関数を作成したくない場合は、要素の属性に値を格納することができます

<.. onClick={() => this.selectMode('commits')}..../> 

:クリックイベントが発生したときにこのように、あなたはthis.selectModeメソッドは、呼び出されます。このように:示すよう

constructor(props) { 
super(props); 
this.state = { mode: 'commits', commits: [], forks: [], pulls: [] }; 
this.selectMode = this.selectMode.bind(this) 
} 
selectMode(event){ 
    this.setState({mode: e.target.name}); 
} 
render(){ 
.... 
    <.. onClick={this.selectMode} name='commits' ..../> 
..} 
+0

要素の属性を使用すると、これらのパラメータを渡すことができます。私はそれを考えて新しくなりました、そして、通過パラメータをカバーした例はありませんでした。 – MartinDuo

1

私は確信していませんが、括弧を付けて各onClick関数を呼び出していると思います。あなたはES6を使用している場合、あなたはこれをやってみてください:

onClick =() => { this.selectMode('commits') } 
onClick =() => { this.selectMode('forks') } 
onClick =() => { this.selectMode('pulls') } 
+1

はい、矢印関数は余分囲む括弧で動作:<ボタンのonClickは= {()=> {this.selectMode( 'コミット')}}>表示をコミット。これは反応文書に示されています。しかし、私は矢の機能を使用しようとしていませんでした。私のやり方はReactドキュメントにもあります(ただし、渡すパラメータは一切表示されません)。 – MartinDuo

関連する問題