【发布时间】:2020-07-02 07:30:12
【问题描述】:
如何在以下上下文中更新函数executeSimulation 内的变量simulationOn 的值:
App this.state.simulationOn 通过外部代码更改 --> ... --> React 无状态组件 (Robot) 重新渲染 --> useEffect 使用新值调用钩子 --> executeSimulation IS未更新为 simulationOn 的新值。
function Robot({ simulationOn, alreadyActivated, robotCommands }) {
useEffect(() => {
function executeSimulation(index, givenCommmands) {
index += 1;
if (index > givenCommmands.length || !simulationOn) {
return;
}
setTimeout(executeSimulation.bind({}, index, givenCommmands), 1050);
}
if (simulationOn && !alreadyActivated) {
executeSimulation(1, robotCommands);
}
}, [simulationOn, alreadyActivated, robotCommands]);
}
在上面的示例中,simulationOn 永远不会更改为 false,即使使用更新的值调用 useEffect(我检查了 console.log)。我怀疑这是因为simulationOn 的新值从未传递到函数executeSimulation 的范围内,但我不知道如何在函数executeSimulation 内传递新的钩子值。
【问题讨论】:
-
simulationOn 改变在哪里?
-
对不起,我只是把问题说得更清楚了!
this.state.simulationOn通过外部代码更改 App 类。 -
我真的不明白是哪一部分的问题?如果您想手动更改simulationOn,则必须将setSimulationOn 回调一直传递到要更改它的组件。如果即使 SimulationOn=false,模拟仍然出现问题,那么问题可能是因为您没有清除 setTimeout。
-
我不想手动更改
simulationOn,这已经发生了。我试图让函数executeSimulation在运行时知道对钩子变量(特别是simulationOn)所做的更改。编辑:尝试清除 setTimeout 但这又被忽略了。 -
为什么
executeSimulation必须在useEffect的范围内?如果您希望它在每次超时时引用simulationOn的当前值,您应该在组件的范围内声明它并直接引用该道具。useEffect有效地为该渲染创建了一个实例,并且单独渲染,不可能在其中传递任何新道具 - 它们将始终传递给一个新实例。
标签: javascript reactjs sleep staleobjectstate