2017-08-28 6 views
1

私はReactを新しくしました。誰でも問題が何であるか私に説明することができますか? onClick関数は両方のボタンから発火し続けて無限の再帰をもたらすようです。ありがとう!JSX onClickは評価を続けますが、InternalError:再帰が多すぎます

export class MyButtons extends React.Component { 
    constructor(props) { 
     super(props); 

     this.state = { selectedIndex: 0 }; 

     this.handleClick = this.handleClick.bind(this); 
    } 

    handleClick(newIndex) { 
     this.setState({ 
      selectedIndex: newIndex 
     }); 
    } 

    render() { 
     return (
      <div> 
       <button onClick={this.handleClick(0)} >Button 0</button> 
       <button onClick={this.handleClick(1)} >Button 1</button> 
       <span>{this.state.selectedIndex}</span> 
      </div> 
     ); 
    } 
} 

答えて

3

参照:関数を呼び出すため

this.handleClick(0)は、クリックせずに、レンダリングして起動します。

その後setStateコール新しい再び​​をレンダリングして呼び出す

onClick={() => this.handleClick(1)}がお手伝いします。

1

あなたはA(その他のソリューションはまた

handleClick(newIndex) { 
    return() => this.setState({ 
     selectedIndex: newIndex 
    }); 
} 

render() { 
    return (
     <div> 
      <button onClick={this.handleClick(0)} >Button 0</button> 
      <button onClick={this.handleClick(1)} >Button 1</button> 
      <span>{this.state.selectedIndex}</span> 
     </div> 
    ); 
} 

機能を返すようにします​​作ることであろう

 <div> 
      <button onClick={() => this.handleClick(0)} >Button 0</button> 
      <button onClick={() => this.handleClick(1)} >Button 1</button> 
      <span>{this.state.selectedIndex}</span> 
     </div> 

それを呼び出すことがない機能を渡すを必要としますそれぞれのレンダーコールで新しい関数を作成することはないので、より多くのperformatアプローチがあります)ボタン自体にEP値(はい、はい<button> has value

handleClick(event) { 
    this.setState({ 
     selectedIndex: +event.target.value 
    }); 
} 

render() { 
    return (
     <div> 
      <button value="0" onClick={this.handleClick} >Button 0</button> 
      <button value="1" onClick={this.handleClick} >Button 1</button> 
      <span>{this.state.selectedIndex}</span> 
     </div> 
    ); 
} 
+0

なぜイベントの前に+がありますか? (selectedIndex:+ event.target.value) – Dimskiy

+0

@Dimskiyあなたは私が推測する数字が欲しいです。 –

0
<button onClick={() => this.handleClick(0)}>Button 0</button> 
+0

それ以外の場合、関数はクリック時ではなくレンダリング時に発生します。がんばろう! – jsw324

+2

この回答の理由を説明できますか? –

関連する問題