第十章:useRef源码解析

前言

本章解锁useRef 源码,useRef 的源码还是很简单的,也是使用十分广泛的hook,而且使用场景还是很广泛的;
useRef 也会配合useImperativeHandleforwardRef 使用;
useRef并不会导致重新渲染,通常会做一些缓存相关的问题。

源码解析

js 复制代码
const ref = useRef(initialValue)

按照常规流程,调用HooksDispatcherOnMountInDEV.useRef 的方法,前置check检查方法,核心方法mountRef

调用mountWorkInProgressHook方法,

js 复制代码
const hook = {
    memoizedState: null,
    baseState: null,
    baseQueue: null,
    queue: null,
    next: null
};
fiber.memoizedState = hook;

mountRef的核心代码也很简单

js 复制代码
const ref = {current: initialValue};
hook.memoizedState = ref;

返回ref对象,源码还是很简单,因为ref是一个对象,默认是使用current对象,可以把useRef当成一个可以缓存的对象;

直接修改ref对象值,并不会导致组件重新渲染,需要通过其他的方法触发渲染。

update阶段

调用HooksDispatcherOnUpdateInDEV.useEffect 方法,调用check方法,核心方法updateRef

调用updateWorkInProgressHook 方法,将mount阶段创建的hook,copy一份,返回fiber.memoizedState ;

因为copy的时候会把上一次的值保存下来,并且是对象引用,所以每次都是最新值。

总结

useRef就是简单创建hook对象,创建一个ref对象。

补充

在使方法通常是

js 复制代码
const ref = useRef(null);
ref.current = value;

可以直接通过改变值的方式修改;

js 复制代码
const ref = useRef(null);
<div ref={ref}></div>

第二种方式涉及到react dom解析,理解成ref.current = div ;

第一种方式常常使用方式,因为ref是一个对象,也可以按照对象方式使用,

js 复制代码
const ref = useRef(null);
ref.key = 'value';
console.log(ref.key)

不常用,不推荐,但是可以使用。

相关推荐
猩猩程序员12 分钟前
Pretext:一个绕过 DOM 的纯 JavaScript 排版引擎
前端
竹林81813 分钟前
从“连接失败”到丝滑登录:我用 ethers.js 连接 MetaMask 的完整踩坑实录
前端·javascript
神舟之光15 分钟前
jwt权限控制简单总结(乡村意见簿-vue-express-mongdb)
前端·vue.js·express
铭毅天下26 分钟前
EasySearch Rules 规则语法速查手册
开发语言·前端·javascript·ecmascript
GISer_Jing38 分钟前
AI Agent操作系统架构师:Harness Engineer解析
前端·人工智能·ai·aigc
英俊潇洒美少年1 小时前
css中专门用来提升渲染性能、减少重排重绘的属性
前端·css
天若有情6731 小时前
前端HTML精讲01:别再乱 div 一把抓,吃透语义化标签才是进阶第一步
前端·html
Highcharts.js1 小时前
React 开发者的图表库生态:Highcharts React
前端·react.js·前端框架
阿部多瑞 ABU1 小时前
文明文化悖论
前端·人工智能·ai写作
钛态1 小时前
Flutter 三方库 react 泛前端核心范式框架鸿蒙原生层生态级双向超能适配:跨时空重塑响应式单向数据流拓扑与高度精密生命周期树引擎解耦视图渲染控制中枢(适配鸿蒙 HarmonyOS ohos)
前端·flutter·react.js