Reactjs 反应:如何在后续的setState()调用中使用this.state?如何强制更新此.state?

Reactjs 反应:如何在后续的setState()调用中使用this.state?如何强制更新此.state?,reactjs,Reactjs,我正在开发一个小应用程序,您可以使用它跟踪一些游戏分数 这场比赛由两名选手进行。一名球员可以得分,但也可能受到处罚。不是从球员的得分中减去点球,而是将点球加到对手的得分中。对手也应该得到下一个回合 我设置了一个实现上述描述的演示: 正如您在演示中所看到的,这并不完全有效:当一名球员受到处罚时,他将被判罚点球,而不是他的对手 这是由于setTurn中的setState未立即处理setScore仍使用“旧”状态,在该状态下,turn尚未更新 我知道这可以通过将回调传递给setState而不是对象(参

我正在开发一个小应用程序,您可以使用它跟踪一些游戏分数

这场比赛由两名选手进行。一名球员可以得分,但也可能受到处罚。不是从球员的得分中减去点球,而是将点球加到对手的得分中。对手也应该得到下一个回合

我设置了一个实现上述描述的演示:

正如您在演示中所看到的,这并不完全有效:当一名球员受到处罚时,他将被判罚点球,而不是他的对手

这是由于
setTurn
中的
setState
未立即处理
setScore
仍使用“旧”状态,在该状态下,turn尚未更新

我知道这可以通过将回调传递给
setState
而不是对象(参见注释代码)来处理,该对象接受以前设置的状态。如果我这样做,事情就会按预期的那样进行

但是,我还需要
addScore
调用之外的
setState
中更新的state值(在本例中为
this.state.turn
)。我将如何实现这一点?我尝试了
这个.forceUpdate()
但是没有用

我是否应该在
setState
回调中包装
addScore
的整个函数体?然后,如果需要,我将如何从
addScore
方法返回基于
this.state.turn的任何计算

附带问题:为什么
这个.forceUpdate()不起作用?它是否只是触发重新呈现组件而不处理状态队列


谢谢你帮助我

我明白你现在在说什么了。据我所知,您试图做的是确保setState方法已在另一个setState方法之前执行

现在,文件中有这样一句话:

第二个参数是一个可选的回调函数,它将 完成设置状态并重新渲染组件后执行。 通常,我们建议对此类逻辑使用componentDidUpdate() 相反

因此,根据他们的建议,您应该使用
componentdiddupdate()
。那么现在的问题是什么呢

componentDidUpdate(prevProps, prevState)
这就是方法签名。因此,我们可以在这里看到前一个状态被传入,现在我们可以通过
this.state
访问当前状态

看看答案

基本上-我将
addScore
changeTurn
转换为只不过是
setState
的片段的函数。这意味着我们可以将它们与或状态更改结合起来,以实现一个原子操作。它们可以重用,而无需为不同的场景添加复杂的默认参数

其次,为了设置状态,我添加了应用这些方法的函数。这些是按钮的用途


最后,在
componentdiddupdate
函数中,现在有机会根据正在执行的当前操作应用操作。不要为默认操作添加setState,否则您将得到一个无限的更新循环……

如果您真的处于当前状态以更改下一个状态,那么在setState中使用回调函数是获得您的评论的更好方法,@Callumlington。因此,如果我将整个函数体包装到
setState
回调中,我将如何将回调体中的任何值返回到
addScore
方法体?比如说,当玩家1的分数达到50分时,我想从
addScore
返回一个值。