[英]React.useMemo() and Event Listener
我正在使用 Hooks 构建一个 REACT 应用程序,现在我在使用useMemo()
和一些事件侦听器时useMemo()
了一个问题。 我已经在 CodeSandBox 上为我的问题准备了一个更简单的演示:这里是链接 → https://codesandbox.io/s/mystifying-hertz-21jov?fontsize=14&hidenavigation=1&theme=dark 。
现在,让我来解释一下其中的问题:我有buttonData
这是使用计算useMemo()
现在,让我们看看控制台输出:
首先, buttonData
在第一次渲染时计算,并且buttonData.behavior
等于test1
。 然后,当我输入按钮时,在onMouseEnterButton
我使用setTargetDOM
:这将触发buttonData
重新计算,因为setTargetDOM
是它的依赖项之一。
到现在为止还挺好:
buttonData.behavior
是test1
;onMouseEnterButton
,现在buttonData.behavior
是test1
;targetDOM
发生了变化,我们再次计算了buttonData
,现在buttonData.beavhior
等于test2
; 现在,问题来了,我不明白! 我可以以某种方式接受这样一个事实,即第四行控制台告诉我buttonDat.behavior
仍然是test1
,因为我们仍然处于更改targetDOM
并因此触发buttonData
更改的同一函数中(即使我希望看到buttonData.behavior: test2
即使在第四行。
更糟糕的是,在onMouseMoveButton
我看到buttonData.behavior
等于test1
,而不是test2
..
问题很简单..为什么? 我的意思是,我想以这种方式实现我的test2
,但我想我在这里错过了一些 React Hook 的东西。
onMouseMoveButton
和onMouseEnterButton
在第一次渲染时捕获buttonData.behavior
并且因为您从不更新事件侦听器,它们将始终引用buttonData.behavior
的初始值
你可以做的是增加buttonData.behavior
到的依赖性阵列useLayoutEffect
每一次buttonData.behavior
变化,它会运行返回功能,删除以前的监听器,并添加新的
React.useLayoutEffect(() => {
...
}, [buttonData.behavior])
此外,状态更新是异步的,因此您在第 4 行设置后无法真正log
更新的状态
setTargetDOM(e.currentTarget);
// this will never the updated value because
// the state updater hasn't run yet
console.log(buttonData.behavior);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.