我的应用的状态是一个填充 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(