2017-01-11 21 views
-1

私はリアクションを学び、チック・タック・トゥ・ゲームを構築しています。 私のコードは以下の通りです:私のSquareコンポーネントでReact js this.setStateが正常に動作していません

var Square = React.createClass({ 
     getInitialState: function() { 
      return { mark: this.props.mark, 
       clicks: 0 
      }; 
     }, 

     respondToClick: function() {  
      if(this.state.mark == '_') {  
       var nextClick = this.state.clicks + 1; 

      } 
      var newMark = nextClick%2 ? 'X' : 'O';     
       this.setState({mark: newMark, clicks: nextClick});    
     }, 
     render: function(){ 
       return (<button className="square" onClick={this.respondToClick}> 
       {this.state.mark} 
       </button> 
       ); 
     } 
    }); 

    var Board = React.createClass({ 

     renderSquare: function(i) { 
       return (<Square mark='_' />); 
     }, 
     getInitialState: function() { 
      return { 
       clicks: 0 
      }; 
     }, 
     changeValue: function(i, val) { 
       return (<Square value={val} />); 
     }, 
     render: function() { 
       const status = 'Next player: X'; 
       return (
        <div> 
         <div className="status">{status}</div> 
         <div className="board-row"> 
          {this.renderSquare(0)} 
          {this.renderSquare(1)} 
          {this.renderSquare(2)} 
         </div> 
         <div className="board-row"> 
          {this.renderSquare(3)} 
          {this.renderSquare(4)} 
          {this.renderSquare(5)} 
         </div> 
         <div className="board-row"> 
          {this.renderSquare(6)} 
          {this.renderSquare(7)} 
          {this.renderSquare(8)} 
         </div> 
        </div> 
       ); 
     } 

    }); 

    var Game = React.createClass({ 
     render: function() { 
       return (
        <div className="game"> 
         <div className="game-board"> 
          <Board /> 
         </div> 
         <div className="game-info"> 
          <div>{/* status */}</div> 
          <ol>{/* TODO */}</ol> 
         </div> 
        </div> 
       ); 
     } 
    }) 

    ReactDOM.render(
      <Game />, 
      document.getElementById('container') 
    ); 

私はrespondToClick方法を持っていると私が持っているメソッド内:

this.setState({mark: newMark, clicks: nextClick}); 

まあ、何とかどちらのマークもクリックが更新されます。私はコールバックを使うことができましたが、私の場合、私はどのようにそれを行うことができません...だれでも助けてくれますか?

+0

と関連性のない副作用として、今日のリアクションにはES6構文を使用することをお勧めします。私は[作成 - 反応 - アプリ](https://github.com/facebookincubator/create-react-app) – Dibesjr

答えて

1

問題は、あなたの状態が階層内で低すぎるということです。今あなたがそのようなあなたが空の角をクリックしたとき、それは1に、クリックカウントをインクリメントして、これは、この機能であるため

respondToClick: function() {  
    if(this.state.mark == '_') {  
     var nextClick = this.state.clicks + 1; 
     var newMark = nextClick%2 ? 'X' : 'O';     
     this.setState({mark: newMark, clicks: nextClick});         
    }    
}, 
を変更することはありませんXにその四角のマークを設定することを持っている

あなたは四角形が '_'のときのみ状態を一度更新し、もう一度それを更新しません。そのifステートメントを削除すると、カウントが正しく増分され、マークが正しく変化することがわかります。

しかし、ターンが変わっていないという全体的な問題を解決するには、正方形をクリックするとXに変わり、別のものをクリックするとOに変わります。ボードコンポーネントの状態まで

+0

私の悪い、それを固定 – ElenaDBA

+0

実際にはifステートメントを削除していないそれを良くしていないチェックアウト - 今いつでも空のボタンをクリックするとXが表示され、同じボタンを繰り返しクリックすると、Oが表示されます。ボードごとにではなくボタンごとにクリック数を登録します。 – ElenaDBA

+0

そうですね、基本的には、あなたのボード状態になっている順番を追跡し、次にそれが回っている各移動変更を追跡する必要があります。私の頭に来る最初のデザインは、ボードの状態にターンキーを追加し、0または1にしてから、正方形をクリックするたびに反転させることです。どの四角があなたのものであるかを把握するために、ボードの状態の各スポットに合った単純な配列を作成して、各コンポーネントを更新して小道具として送ることができます。それが勉強する最善の方法であるので、私はそれを周りに遊ぶことをお勧めします! – Dibesjr

関連する問題