当前位置: 首页 > article >正文

react 常见的闭包陷阱深入解析

一、引子

先来看一段代码,你能说出这段代码的问题在哪吗?

const [count, setCount] = useState(0);
useEffect(() => {const timer = setTimeout(() => {setCount(count + 1);}, 1000);return () => clearTimeout(timer);
}, []);

正确答案:

这段代码存在闭包陷阱,会导致 setTimeout 中的回调函数捕获到的 count 值始终是初始值 0,最终定时器只会执行一次,count 永远停留在 1。

问题分析

  1. 依赖数组为空:
    useEffect 的依赖数组为 [],意味着它只在组件挂载时执行一次。此时 count 的初始值为 0,被闭包捕获到 setTimeout 的回调函数中。
  2. 闭包导致的 stale 值:
    当定时器触发时(1 秒后),回调函数使用的是捕获时的 count 值(即 0),而非最新值。因此每次执行 setCount(count + 1) 实际都是 setCount(0 + 1),导致 count 永远为 1。
  3. 清除定时器的副作用:
    虽然每次都会清除前一个定时器,但由于依赖数组为空,useEffect 不会重新执行,因此新的定时器不会被创建,后续更新被中断。

解决方案

  1. 使用函
http://www.lryc.cn/news/2404668.html

相关文章:

  • 【CATIA的二次开发22】关于抽象对象Document概念详细总结
  • 模拟法解题的思路与算法分享
  • mysql密码正确SpringBoot和Datagrip却连接不上
  • 高保真组件库:数字输入框
  • 人工智能赋能高中学科教学的应用与前景研究
  • 【Linux】awk 命令详解及使用示例:结构化文本数据处理工具
  • 紫光同创FPGA系列实现Aurora 8b/10b协议
  • DAY 44 预训练模型
  • [Harmony]颜色初始化
  • 指针与函数参数传递详解 —— 值传递与地址传递的区别及应用
  • 【NLP中向量化方式】序号化,亚编码,词袋法等
  • C++学习-入门到精通【16】自定义模板的介绍
  • 关于脏读,幻读,可重复读的学习
  • 源码级拆解:如何搭建高并发「数字药店+医保购药」一体化平台?
  • 旅行商问题(TSP)的 C++ 动态规划解法教学攻略
  • unix/linux,sudo,其内部结构机制
  • Hadoop 3.x 伪分布式 8088端口无法访问问题处理
  • Redis线程安全深度解析:单线程模型的并发智慧
  • 零基础在实践中学习网络安全-皮卡丘靶场(第十期-Over Permission 模块)
  • 北京大学肖臻老师《区块链技术与应用》公开课:12-BTC-比特币的匿名性
  • [Harmony]网络状态监听
  • 毕设 基于机器视觉的驾驶疲劳检测系统(源码+论文)
  • Ubuntu18.6 学习QT问题记录以及虚拟机安装Ubuntu后的设置
  • Vue3中computed和watch的区别
  • 发版前后的调试对照实践:用 WebDebugX 与多工具构建上线验证闭环
  • 瀚文(HelloWord)智能键盘项目深度剖析:从0到1的全流程解读
  • Shell编程核心符号与格式化操作详解
  • 针对“仅某个地区出现Bug”的原因分析与解决方案
  • 学习STC51单片机30(芯片为STC89C52RCRC)
  • sql中group by使用场景