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);
  };
}, [);
相关推荐
sycmancia几秒前
Qml——Text元素
java·前端·html
DevChronosands_4 分钟前
浅谈感受之 React 与 Vue 😒
前端
代码猎人5 分钟前
前端怎么掌握模块化
前端
天才熊猫君6 分钟前
前端队列,我是怎么从 `push + shift` 换成游标的
前端·javascript
星_离12 分钟前
《Ajax - 实战基础篇》
前端·ajax
gCode Teacher 格码致知20 分钟前
前端教学8:提高 CSS 选择器的优先级,有哪些方法?
前端·css·html5
u01110267525 分钟前
Canvas 导出 PNG 时 quality 参数为什么不起作用
前端·javascript·vue.js
众链网络31 分钟前
年卡跨淡旺季的有效期模型:不可用日期、次数与顺延规则
java·前端·数据库
2601_9498477535 分钟前
jose 跨端三方库仓颉适配全流程
前端·javascript·flutter
CappuccinoRose1 小时前
滚动交互体系
前端·javascript·交互·html5·1024程序员节