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);
  };
}, [);
相关推荐
小岛前端23 分钟前
前端真神器!RD280U 让我写码效率暴涨!
前端·程序员
hqk35 分钟前
鸿蒙项目实战:手把手带你从零架构 WanAndroid 鸿蒙版
前端·架构·harmonyos
大时光42 分钟前
粒子形成文字
前端
Kayshen42 分钟前
春节期间我们开源了一个 AI-Native 的矢量设计工具,对标 Pencil.dev,让 AI Agent 直接画 UI
前端·aigc·agent
没想好d1 小时前
通用管理后台组件库-6-头部导航组件
前端
linux_cfan1 小时前
打造智慧校园视听新基建:高校与在线教育平台 Web 视频播放器选型指南 (2026版)
前端·学习·音视频·教育电商
JYeontu1 小时前
实现一个超萌的柯基交互输入框
前端
天蓝色的鱼鱼1 小时前
Vite 8:从“混动”到“纯电”,构建性能提升10倍+
前端·vite
dreams_dream1 小时前
XSS类型
前端·xss
wuhen_n1 小时前
副作用的概念与effect基础:Vue3响应式系统的核心
前端·javascript·vue.js