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);
  };
}, [);
相关推荐
全马必破三22 分钟前
Vue3+Node.js 实现AI流式输出全解析
前端·javascript·node.js
belldeep31 分钟前
前端:TypeScript 版本 2 , 3 , 4 , 5 , 6 有什么差别?
前端·javascript·typescript
液态不合群34 分钟前
Redis命令处理机制源码探究
前端·redis·bootstrap
指尖的记忆1 小时前
前端 Monorepo 实战指南:仓库多到切疯?
前端
csdn2015_1 小时前
java 把对象转化为json字符串
java·前端·json
shughui1 小时前
Fiddler(二):自动转发(AutoResponder)功能详解
前端·测试工具·fiddler
初见雨夜1 小时前
OpenAI 官方出手:把 Codex 接进 Claude Code
前端·openai·ai编程
前端付豪1 小时前
实现消息级操作栏
前端·人工智能·后端
GISer_Jing1 小时前
Claude Code的「渐进式披露」——让AI Agent从“信息过载”到“精准高效”
前端·人工智能·aigc
apcipot_rain1 小时前
HTML知识概述
前端·javascript·html