react useEffect中window.removeEventListener没生效问题解决

在useEffect中写入window.removeEventListener没有生效,代码如下

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定义一个函数,确保函数在重新渲染是不被重新创建。

const handleResize = useCallback(() => {
  console.log(window.innerWidth, window.innerHeight);
}, []);
 
useEffect(() => {
  window.addEventListener('resize', handleResize);
  return () => {
    window.removeEventListener('resize', handleResize);
  };
}, [);

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 11:24:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 11:24:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 11:24:02       87 阅读
  4. Python语言-面向对象

    2024-04-27 11:24:02       96 阅读

热门阅读

  1. 对于C# 任务并行库(TPL)的一些理解

    2024-04-27 11:24:02       35 阅读
  2. [C++] 小游戏 斗破苍穹 2.10.5 版本 zty发布

    2024-04-27 11:24:02       28 阅读
  3. Python项目开发实战:怎么删除恶意代码

    2024-04-27 11:24:02       35 阅读
  4. 【笔记】非Transformer结构

    2024-04-27 11:24:02       25 阅读
  5. 安全作业-1

    2024-04-27 11:24:02       28 阅读
  6. DevOps(十六)Nexus二进制仓库与Jenkins

    2024-04-27 11:24:02       35 阅读
  7. 商城数据库(33-36)

    2024-04-27 11:24:02       34 阅读
  8. ModuleNotFoundError: No module named ‘pyautogui‘

    2024-04-27 11:24:02       27 阅读
  9. MATLAB初学者入门(19)—— 均值算法

    2024-04-27 11:24:02       32 阅读
  10. 8086:qemu执行汇编

    2024-04-27 11:24:02       34 阅读
  11. 学习前端二十八天(数组方法)

    2024-04-27 11:24:02       34 阅读