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);
  };
}, [);
相关推荐
木易士心3 分钟前
从 MVP 到千万级并发:AI 在前后端开发中的差异化落地指南
前端·后端
葡萄城技术团队5 分钟前
字体与打印:前端开发最常见的三个“为什么”
前端
王夏奇7 分钟前
python中的深浅拷贝和上下文管理器
java·服务器·前端
siger12 分钟前
徒手开荒-我用纯Nodejs+pnpm+monorepo改造了一个多vue2的iframe"微前端"项目
前端·node.js·前端工程化
lichenyang45313 分钟前
海克斯大乱斗攻略网站 —— 从零开发到云服务器部署全记录
前端
你的代码僚机16 分钟前
《别再被 SSO 骗了!前端单点登录原理+避坑指南》
前端
不懂代码的切图仔31 分钟前
移动端h5实现横屏在线签名
前端·微信小程序
少卿34 分钟前
OpenClaw 的 summarize 技能——开发者的智能摘要利器
前端·后端·程序员
麦秋36 分钟前
前端静态页面自动生成(Figma MCP + VS code + Github copilot)
前端·vue.js
不甜情歌36 分钟前
JS对象入门|从创建到原理,一篇吃透核心知识点
前端·javascript