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);
  };
}, [);
相关推荐
MXN_小南学前端3 分钟前
Vue + Quill:富文本的添加、传输、展示逻辑,以及 csReplyQuill 组件封装
前端·vue.js
XS0301064 分钟前
Java Web实现简易CRUD操作笔记
java·前端·笔记
Shadow(⊙o⊙)5 分钟前
qt内详解信号和槽的基本概念+实例演示
开发语言·前端·c++·qt·学习
qq_381338507 分钟前
Vue3 组合式函数设计模式:从基础封装到高级复用实战
前端·vue.js·设计模式
步十人7 分钟前
【CSS】基础一篇过
前端·css
回眸一笑吟离歌9 分钟前
edge浏览器更新后打开局域网服务报错:ERR_ADDRESS_UNREACHABLE
前端·edge
幽络源小助理13 分钟前
在线图片处理工具源码, 多功能编辑格式转换HTML单文件版
前端·html
humcomm16 分钟前
AI编程时代前端架构师的机遇和挑战
前端·架构·ai编程
adminwolf25 分钟前
自研企业微信SCRM系统源码独立部署(Golang+Vue.js)
前端·vue.js·企业微信
小短腿的代码世界26 分钟前
QwtPolar 与实时示波器级渲染优化:雷达图到示波器曲线的极限性能调优
前端·qt·架构·交互