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);
  };
}, [);
相关推荐
禅思院7 小时前
流式 Markdown 渲染完全指南【引子】
前端·架构·前端框架
JackSparrow4147 小时前
前端安全之JS混淆+请求加密+请求签名以提升爬虫难度
前端·javascript·后端·爬虫·python·安全
IMPYLH7 小时前
HTML 的 <em> 元素
java·前端·html
名为沙丁鱼的猫7299 小时前
【审计日志组件实践复盘】前端工程化 + 后端DDD架构(AOP切面拦截日志) + MBG
前端·架构
xqqxqxxq10 小时前
AI智能旅游规划系统 - 前端技术笔记
前端·笔记·旅游
陈随易16 小时前
bm2,MoonBit实现的pm2替代品
前端·后端·程序员
a11177618 小时前
农业数字孪生大屏网页 html开源
前端·html
圣光SG18 小时前
web操作题练习(六)
前端
闪亮的路灯19 小时前
威联通QTS使用自带web服务期代理前端(类似nginx)
前端·nginx·威联通
kyriewen20 小时前
我用AI写了半年代码——回头看,这5个能力正在退化
前端·javascript·ai编程