嗨所以情况就是这样 . 我正在 Build 一个反应的tictactoe游戏,我有3个组件1. GameParent 2. board 3. gameControls
我在GameParent组件中有一个函数有两个名为AI和Game的状态属性,它们是对象 . 我将这些对象作为支柱传递给板组件 . 它还有一个名为startGame()的函数
startGame() {
let newAI = new AI(this.state.AIIdentity);
let newGame = new Game(newAI,this.state.AIIdentity);
this.state.AI.plays(this.state.Game);
this.state.Game.start();
this.setState({
start: true,
AI: newAI,
Game: newGame,
});
console.log("THIS!!!",this)
console.log("THIS!!!",this.state)
console.log("THIS!!!",this)
console.log("THIS!!!",this.state.Game);
}
调用this.state.Game.start()时,Game对象中有一个名为status的属性,应该更改为“running”
我将startGame()函数传递给我的gameControls组件,然后将它附加到我的启动按钮onClick handler .
我的电路板组件处理电路板方块上的点击,但是如果Game.status ===“正在运行”,它只记录点击次数,但我继续获得状态===“开始”的对象 .
所以当我添加这4个console.logs时,当我打印出这个时,我看到Game对象的状态是“开始”但是当我在console.log this.state和this.state.Game时,状态设置为“运行“!
我很困惑,为什么会发生这种情况...我猜这是React更新它的孩子的方式,但我没有从阅读如何解释render()和setState()的工作原理 . 或者,当我将函数和对象传递给子组件时,我可能还没有完全理解“this”是如何影响的 .
如果你们想看到完整的代码,这里是链接http://codepen.io/comc49/pen/WRqBXr?editors=0110
1 回答
你不应该把函数放在状态中 . State仅用于数据 . 我认为这可能是意外行为的一个来源 .
this.setState
是一个异步函数,这意味着无法保证在调用this.setState
之后立即设置状态 . 这可以解释console.logs
的意外输出