第十章:useRef源码解析

前言

本章解锁useRef 源码,useRef 的源码还是很简单的,也是使用十分广泛的hook,而且使用场景还是很广泛的;
useRef 也会配合useImperativeHandle 和forwardRef 使用;
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)

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

相关推荐
鬼手点金2 小时前
nanoGPT/nanochat 能做出 DeepSeek/Qwen 这样的大模型吗?
服务器·前端·javascript·bug·openclaw
蛋蛋的就会顺顺的2 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
程序员Sunday2 小时前
TypeScript 的 any、unknown、never 有什么区别?
前端·面试·typescript
朱涛的自习室2 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
码艺-Alimjan3 小时前
Tauri 源码备份 · 打包 & 解压 总结,源码收集之路
前端·javascript·vue.js
小马不起床3 小时前
零基础玩转 FastAPI_11:前端后台管理页面
前端·状态模式·fastapi
子非鱼a4 小时前
【文件上传】一个普普通通的edu16
前端
美狐美颜SDK开放平台5 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
pride.li5 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
屏什么录6 小时前
电脑如何录屏幕视频和声音?从工具到代码,7 种方案帮你彻底搞定
前端·音视频开发