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

React-useRef

如果我们想在hooks里面获同步取最新的值,那么则可以使用useRef, 关键源码如下:


function mountRef<T>(initialValue: T): {|current: T|} {const hook = mountWorkInProgressHook();const ref = {current: initialValue};hook.memoizedState = ref;return ref;
}function updateRef<T>(initialValue: T): {|current: T|} {const hook = updateWorkInProgressHook();return hook.memoizedState;
}

可以看到,代码实现非常简单,创建一个ref对象,然后挂载到hook.memoizedState, 我们在修改的时候,就是直接修改ref.current。useRef其实就是提供一个稳定的变量,在组件的整个生命周期都是持续存在且是同一个引用。
注意:修改useRef返回的状态不会引起UI的重渲染。

为什么在setTimeout的回调函数里面,拿不到useState的最新值?
主要有以下三点原因:
•  react 中的state,遵循着状态不可变的原则,在setState之后,不会修改原来老的state的值,而是把新值重新赋值给hook.memoizedState
•  对于react函数组件,其本身就是个render函数,每次重渲染之后,都会重新执行此函数,而每次执行的时候就会产生一个新的函数作用域。
•  setTimeout的回调函数对hook.memoizedState形成了闭包引用,而在setState之后,都会重新执行组件函数,setTimeout 的回调函数会捕获在 setTimeout 被创建时的状态的快照,而不是最新的状态。

但是为什么又能获取useRef的最新值呢?
useRef本身并不能解决闭包引用的问题,但是它通过创建一个稳定的引用:

function mountRef<T>(initialValue: T): {|current: T|} {const hook = mountWorkInProgressHook();const ref = {current: initialValue};hook.memoizedState = ref;return ref;
}

mount在整个组件生命周期,只会触发一次,因此只会创建一次。然后这也是为什么要创建一个对象,而对象上近仅创建一个current属性来存储数据,正是为了让开发者在整个生命周期,拿到的始终是同一个引用,可以把它想象成当前组件域下的一个全局变量了,而修改数据仅仅在这个引用上的current属性修改。

相关文章:

  • 【Redis】从单机架构到分布式,回溯架构的成长设计美学
  • 数据驱动增长:大数据与营销自动化的结合之道
  • 学习设计模式《三》——适配器模式
  • Java 并发性能优化:线程池的最佳实践
  • 【上海大学计算机系统结构实验报告】多机环境下MPI并行编程
  • Ai Agent 在生活领域的深度应用与使用指南
  • Flink介绍——实时计算核心论文之Kafka论文总结
  • NoSQl注入学习
  • OpenLayers:视图变换的方法
  • Python语法系列博客 · 第3期 数据结构入门(列表、元组、字典、集合)
  • 从代码学习深度学习 - 优化算法 PyTorch 版
  • MPTCP 的吞吐困局
  • ICS丨Chapter 1 Introduction to Computer System
  • MFC文件-屏幕录像
  • C 语言联合与枚举:自定义类型的核心解析
  • [Swift]Xcode模拟器无法请求http接口问题
  • Qt unknown module(s) in qt:serialport解决方法
  • Oracle Recovery Tools修复ORA-600 6101/kdxlin:psno out of range故障
  • C++11新增语法:列表初始化
  • 实现AWS Lambda函数安全地请求企业内部API返回数据
  • 见证历史与未来共舞:上海西岸“蝶变共生”对话讲坛圆满举行
  • 铁路12306回应“五一前大量放票”传闻:个别方向和区段出现新增票额,均即时进入系统重新发售
  • 对谈|《对工作说不》,究竟是要对什么说不?
  • 当农民跨进流动的世界|劳动者的书信①
  • 国际锐评:菲律宾“狐假虎威”把戏害的是谁?
  • 书业观察|一本书的颜值革命:从毛边皮面到爆火的刷边书