控制台.log只显示原始状态,即使我 100% 确定该状态正在 React 中更新



我的应用的状态是一个填充 0 的 2D 数组。当我运行应用程序时,将遍历 2d 数组,并且在遍历发生时,这些 0 将更改为 1。这反映在屏幕上,因为网格单元格在从 0 变为 1 时将颜色从透明变为蓝色。

所以基本上我要说的是,我可以看到状态正在更新。如果我查看开发工具中的组件选项卡,我的状态也反映了这一点。所以,我的问题来了:

当我控制台.log状态时,我唯一看到的是充满 0 的原始状态。网格遍历在循环上执行,因此每一秒我都可以看到状态在变化,但控制台的每个循环.log都不会改变。

我在这里阅读了有关反应状态更新是异步的其他问题,人们尝试在完成更新之前记录新状态。但这似乎不是我的问题,因为我实际上 100% 确定状态已更新,正如我的浏览器和开发工具中的视觉对象所证实的那样。

这是带有我的代码的github存储库的链接:https://github.com/jeffpalmeri/graph-traversal/blob/master/src/App.js

知道为什么会这样吗?

我指的是控制台.log在第 121 行。

我认为这可能与您的参考以及您打开控制台并观看它的时间有关。

前任。

你有一个数组a=[1,2,3],对这个a的引用在打印输出过程中不会改变,所以这一秒是1,2,3,下一秒是2,3,4。最终它会像3,4,5一样稳定.

如果您在最后一分钟打开控制台选项卡,我想您会看到一切都3,4,5。除非在打印输出期间,否则您这样做

console.log(a.slice())

您正在使用useCallback钩子。React 文档说:

useCallback 将返回回调的记忆版本,仅当其中一个依赖项发生更改时才会更改。

https://reactjs.org/docs/hooks-reference.html#usecallback

由于未指定任何依赖项,因此回调永远不会更改,并且由于闭包 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures( 将始终打印相同的grid值。此外,您正在使用setTimout在回调中调用回调。由于您的回调永远不会更改,因此即使您指定了依赖项,它也将始终引用初始回调,同样是由于闭包。

如果要在更新grid状态后对其进行某些操作,请使用useEffect(https://reactjs.org/docs/hooks-reference.html#useeffect(

最新更新