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);
  };
}, [);
相关推荐
代码无边,回头是岸1 分钟前
allfile‑preview|一款适配局域网,开箱即用的前端统一文件预览方案
前端
曹牧24 分钟前
Spring MVC : Controller 层URL划分
java·运维·服务器·前端
njsgcs35 分钟前
safari局域网读电脑地址,第一次读的到,重载之后就不行,得重启。.local解决办法
前端·电脑·safari
Lank_M43 分钟前
超分分块为什么按后端分:160与96的取舍
前端
流星。。方1 小时前
企业官网前端组件怎么拆?从落地页到内容页的分层思路
前端
deli0071 小时前
豹纹和斑马纹是怎么长出来的:调两个参数,花纹自己浮现
前端
进击的明明1 小时前
TypeScript速通笔记(上)
前端·面试·typescript
deli0071 小时前
萤火虫为什么会一起闪:调一个耦合系数,整片林子自己同步
前端
计算机魔术师1 小时前
英伟达联合超100家伙伴推出开放代理安全平台
前端
看谷秀1 小时前
arkts-12 鸿蒙生态/卡片
前端·arkts