reactjs - 使用 React 的 UseEffect 和事件监听器的区别?
问题描述
所以我试图理解在 React 中编写这个事件监听器有什么问题?我注意到其他人将它包装在 useEffect 钩子中并添加了一个 removeEventlistener,但我不明白这一点,因为它与我的代码做同样的事情。
这是我的代码
function App() {
const hideMenu = () => {
if (window.innerWidth > 768) {
setIsOpen(false);
}
};
window.addEventListener('resize', hideMenu);
}
将此代码放入 useEffect 挂钩有什么意义?为什么我不能只使用上面的代码就可以了?
这是放在 useEffect 挂钩中的相同代码
useEffect(() => {
const hideMenu = () => {
if (window.innerWidth > 768) {
setIsOpen(false);
}
};
window.addEventListener('resize', hideMenu);
}, []);
根据我的网站,这两种方法都做同样的事情,那么我如何在控制台中检查执行 useEffect 的目的与我编写它的方式?
如果屏幕大于 768px,我的功能的全部要点就是隐藏移动菜单。
解决方案
您的解决方案可能会遇到 2 个问题。
每次状态变量更改或组件重新渲染时,它都会向您的窗口添加一个新的事件侦听器。如果它处于空括号的使用效果中,它只会在组件第一次渲染时运行,类似于“ComponentDidMount”。
如果这不是您最顶级的根组件,并且有人要离开您的屏幕,那么目前您不会删除您的事件侦听器。这在未来可能会出现问题,或者只是在监听无用的信息。当你卸载监听器时,它保证它在未使用时消失,如果你要回去,它会重新添加监听器。
useEffect(() => {
const hideMenu = () => {
if (window.innerWidth > 768) {
setIsOpen(false);
}
};
window.addEventListener('resize', hideMenu);
return () => {
window.removeEventListener('resize', hideMenu);
}
}, []);
推荐阅读
- python-3.x - csv仅在python中写入最后一行
- javascript - 数据层变量不起作用 - GTM 上的自定义 HTML 代码
- python - 加载使用 FloPy MODFLOW 创建的 MNW2 包时出错
- node.js - 使 VSCode 扩展解析实时文档并访问输出
- actionscript-2 - 测试 AS2 消息的客户端
- c# - 如何优化将指针数组复制到另一个数组?
- node.js - Nginx proxy_reverse 和节点服务器。您在哪里看到来自上游 NODE 服务器的控制台日志 OUTPUT?
- math - 在不同计数算法的公式中,^ 符号是什么意思?
- c# - Blazor 在布局上加载元素
- azure - 动态营销分析模板报告超时