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 分钟前
cornerstone3D 通过二进制渲染影像
前端
一只小阿乐8 分钟前
react路由中使用context
前端·javascript·react.js·context 上下文
Hilaku8 分钟前
一周狂揽40K+ Star⭐ 的 Pretext 到底有多变态?
前端·javascript·html
Southern Wind11 分钟前
AI Skill Server 动态技能中台
前端·后端·mysql·node.js
锦木烁光32 分钟前
多端项目太乱?我是这样用 Monorepo 重构的
前端·架构
上山打牛36 分钟前
cornerstone3D基本使用
前端
阿鑫_99637 分钟前
通用-Nvm基础知识
前端
xinzheng新政42 分钟前
Javascript·深入学习基础知识
前端·javascript·学习
前端付豪1 小时前
实现记忆开关
前端·后端
前端开发呀1 小时前
约定式路由的极简主义实践:一个插件搞定 React/Vue × Vite/Rspack
前端