React 中从 useEffect 里安全地移除全局事件监听:为什么你的回调总是旧值
在 React 项目里给 window 或 document 绑定键盘快捷键、滚动监听、点击外部关闭下拉菜单,是再常见不过的需求。很多人会写在 useEffect 里,然后加上 removeEventListener,结果发现要么移除不掉导致内存泄漏,要么回调里拿到的 state 永远是初始值。最常见的写法是直接在 effect 内部定义函数并引用,但依赖数组写空数组,闭包就把第一次渲染的变量锁死了。另一个坑是函数引用每次渲染都变,导致监听被反复解绑又绑定,性能白白损耗。这篇文章从一个实际的下拉菜单组件出发,聊清楚闭包捕获、依赖数组和清理函数之间的关系,再给出用 useRef 保存回调、用 A...