react useEffect中removeEventListener没生效问题解决

在useEffect中写入window.removeEventListener没有生效,代码如下

javascript 复制代码
useEffect(() => {
  const handleResize = () => {
  	console.log(window.innerWidth, window.innerHeight);
  };
  window.addEventListener('resize', handleResize);
  return () => {
    window.removeEventListener('resize', handleResize);
  };
}, [);

没生效原因:

在 removeEventListener 中所传递回的调函数需要与 addEventListener 中的保持一致,而在react中,因为视图更新所产生的更改,导致在return时所传递的函数是最新创建的函数,而不是在addEventListener中所传递的,简单来说就是react的更新机制所导致的引用问题。

解决方法:

使用useCallback来缓存一个函数,避免在每次渲染时重新创建这个函数。

也可以用useRef定义一个函数,确保函数在重新渲染是不被重新创建。

javascript 复制代码
const handleResize = useCallback(() => {
  console.log(window.innerWidth, window.innerHeight);
}, []);
 
useEffect(() => {
  window.addEventListener('resize', handleResize);
  return () => {
    window.removeEventListener('resize', handleResize);
  };
}, [);
相关推荐
excel3 分钟前
Vue 编译器核心模块解读:stringifyStatic 静态节点字符串化机制
前端
excel5 分钟前
深度解析 Vue 编译阶段的 transformStyle:从静态 style 到动态绑定的转换逻辑
前端
excel6 分钟前
Vue 编译器源码解析:忽略副作用标签的 NodeTransform 实现
前端
excel7 分钟前
深入理解 Vue 编译阶段的 v-html 指令转换逻辑
前端
excel8 分钟前
Vue 模板编译中的 HTML 嵌套验证机制:validateHtmlNesting 源码解析
前端
excel9 分钟前
Vue Compiler 内部机制解析:transformTransition 源码深度剖析
前端
岁月玲珑11 分钟前
ComfyUI如何配置启动跳转地址127.0.0.1但是监听地址是0.0.0.0,::
java·服务器·前端
wuk99819 分钟前
Webpack技术深度解析:模块打包与性能优化
前端·webpack·性能优化
Moment41 分钟前
Cursor 2.0 支持模型并发,我用国产 RWKV 模型实现了一模一样的效果 🤩🤩🤩
前端·后端·openai
狂炫冰美式1 小时前
QuizPort 1.0 · 让每篇好文都有测验陪跑
前端·后端·面试