这是我的模特:
class Board extends React.Component {
constructor() {
super();
this.state = {
squares: Array(3).fill(Array(3).fill(null)),
xIsNext: true
};
}
get turn() {
return this.state.xIsNext ? 'X' : 'O';
}
handleTurn(x, y) {
const squares = this.state.squares.slice().map(function(row) {
return row.slice();
});
const turn = this.turn; // this returns either "X" or "Y"
squares[x][y] = turn; // this is the value I'm going to be accessing later on
this.setState({
squares: squares
});
if (this.isSolved(x, y)) {
console.log('VICTORY!')
}
this.nextPlayer();
}
isSolved(x, y) {
var count = 0
var player = this.state.squares[x][y]; // here is when I try to access the value set at at 'handleTurn')
// more stuff down there
return false;
}
我的问题是这样的:isSolved
来自handleTurn
,而handleTurn
我会设置一个从二维到'X'或'的坐标Y';但是当我在isSolved
中检查该值时,我总是得到之前的值,而不是我刚设置的值。
例如,第一次通话时会收到null
(当我希望X
时),第二次通话时我会得到X
(当我期待{{1}时然后),等等。
答案 0 :(得分:4)
在React setState
works (mostly) asynchronously中,以便能够在一次传递中批量处理多项更改。
这意味着,当您this.setState
handleTurn
时,状态实际上尚未更改。
您可以传递setState
第二个参数,这是一个在实际更改状态时要执行的回调函数。
这是一篇有趣的文章,更深入地探讨了setState
的行为:https://www.bennadel.com/blog/2893-setstate-state-mutation-operation-may-be-synchronous-in-reactjs.htm