React方法组件添加事件监听器产生的闭包问题如何解决?
示例代码如下,通过DOM2的addEventListener方式添加的事件监听器,总读取不到最新的count值。但如果我采用React的合成事件onClick以及将count移出到TestDemo外,可以解决该问题,但我不明白此处为何会产生闭包
const TestDemo = (props: any) => {
const [count, setCount] = useState(0);
useEffect(() => {
const btn = document.getElementById('btn');
if (btn) {
btn.addEventListener('click', handleClick);
}
}, []);
const handleClick = () => {
console.log(count);
setCount(count + 1);
};
return (
<div>
<button id={'btn'}>点击</button>
</div>
);
};
回复
1个回答

test
2024-07-13
如评论区大佬所言,React Hooks 闭包陷阱的文章俯拾皆是。这里主要是回调函数handleClick
中捕获了 count
,因此应当将 count
纳入依赖,除此之外副作用需要及时清除:
useEffect(() => {
const btn = document.getElementById('btn');
if (btn) {
btn.addEventListener('click', handleClick);
return () =>{
// 清除副作用
btn.removeEventListener('click', handleClick);
}
}
}, [count]);
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容