使用 useRef 解决闭包陷阱的问题

在我们日常开发过程中可能会遇到定时器中的state获取不到最新状态,这种现象被称为“闭包陷阱”或者被叫做“Capture Value” 。

如下:

我们发现弹出的值和当前页面显示的值并不相同

logHandle方法里面的data和点击动作触发那一刻的data相同,但是data后续变化并不会对logHandle内的data造成任何影响

函数式组件每次render 都会生产一个新的 logHandle 函数,这个新的 logHandle 函数会产生一个在当前这个阶段 data 值的闭包。

接下来我们对上面例子进行简单分析:

首次渲染页面,这个时候我会生成一个logHandle的函数 (data = 1)

data为1时 点击alert触发logHandle函数(data = 1)

点击 add 增加data,比如data增加到10,这个时候组件render,会生成一个在当前阶段的logHandle函数(data = 10)并不会影响首次页面加载时生成的logHandle函数

最后定时器触发,logHandle函数(data = 1),弹出闭包内的data为1

如何让弹窗中展示最新的data值呢?

我们可以通过 React hooks中的 useRef 来简单解决闭包陷阱的问题

 useRef 每次 render 时都会返回同一个引用类型的对象,我们设置值和读取值都在这个对象上处理,这样就能获取到最新的 value 值了。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值