React js this.setState 无法正常工作
React js this.setState is not working properly
我正在学习 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});
好吧,标记和点击都没有更新。我可以使用回调,但就我而言,我不知道该怎么做...有人可以帮忙吗?
问题是您存储的状态在层次结构中太低了。
现在你有了它,当你点击一个空方块时,它会将点击计数增加到 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 组件的状态。
我正在学习 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});
好吧,标记和点击都没有更新。我可以使用回调,但就我而言,我不知道该怎么做...有人可以帮忙吗?
问题是您存储的状态在层次结构中太低了。
现在你有了它,当你点击一个空方块时,它会将点击计数增加到 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 组件的状态。