【问题标题】:React js this.setState is not working properlyReact js this.setState 无法正常工作
【发布时间】:2017-01-11 15:39:09
【问题描述】:

我正在学习 React 并构建一个井字游戏。 我的代码如下:

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')
    );

在我的Square 组件中,我有respondToClick 方法,在我的方法内部:

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

嗯,不知何故,标记和点击都不会更新。我可以使用回调,但在我的情况下,我看不出我该怎么做......有人可以帮忙吗?

【问题讨论】:

  • 作为一个不相关的旁注,现在建议使用 ES6 语法进行反应。我会查看create-react-app

标签: reactjs react-jsx tic-tac-toe


【解决方案1】:

问题是您存储的状态在层次结构中太低了。

现在你有它,当你点击一个空方块时,它会将点击计数增加到 1,然后将该方块的标记设置为 X。这永远不会改变,因为在这个函数中

respondToClick: function() {    
    if(this.state.mark == '_') {    
        var nextClick = this.state.clicks + 1;
        var newMark = nextClick%2 ? 'X' : 'O';                  
        this.setState({mark: newMark, clicks: nextClick});                                  
    }               
},  

当方块为“_”时,您只会更新一次状态,并且永远不会再更新一次。如果您删除该 if 语句,您将看到您的计数正确增加并且标记正确更改。

但是,解决您的整体问题的解决方案,即当您单击一个正方形时,它会变成 X,当您单击另一个正方形时,它会变成 O,这可以通过移动其轮到的状态来解决到 Board 组件的状态。

【讨论】:

  • 实际上删除 if 语句并没有让它变得更好 - 现在每次我点击空按钮我都会得到一个 X,只有当我重复点击同一个按钮时,我才会得到一个 O。所以它注册每个按钮的点击计数不是每个板。如何将状态移动到板组件?
  • 对,所以基本上你需要跟踪在你的棋盘状态下轮到谁,然后在每次移动时改变轮到谁。我想到的第一个设计是在 Board 的状态下添加一个交钥匙,并将其设置为 0 或 1,然后每次单击正方形时,将其反转。要跟踪哪些方块是什么,您可以有一个简单的数组,该数组与您更新的板状态中的每个点相匹配,并将其作为道具发送到每个组件。我会建议玩它,因为这是最好的学习方式!
  • 谢谢。如何从 Square 设置 Board 的状态?
猜你喜欢
  • 2020-02-28
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
相关资源
最近更新 更多