0

0

React 中 ref 回调函数接收 null 的原因解析

心靈之曲

心靈之曲

发布时间:2025-12-26 19:31:11

|

228人浏览过

|

来源于php中文网

原创

React 中 ref 回调函数接收 null 的原因解析

react 中,ref 回调函数(如 `ref={el => {...}}`)会在 dom 元素挂载时传入真实节点,卸载时传入 `null`,这是 react 内置的生命周期行为,用于确保 ref 始终准确反映 dom 状态。

当你使用函数式 ref(即 ref={el => inputsRef.current[i] = el})时,React 会在两个关键时机调用该回调

  • 挂载阶段:DOM 元素首次插入文档后,React 传入对应的 HTMLInputElement 实例;
  • 卸载阶段:当该元素被移除(例如数组长度变化、条件渲染导致组件消失、父组件重渲染等),React 会再次调用该回调,并传入 null,以显式通知你“这个 ref 已失效”。

这就是为什么 el 类型为 HTMLInputElement | null —— TypeScript 正确地反映了这一双向生命周期语义。

Catimind
Catimind

专为行业应用打造的AI生产力工具

下载

正确处理 null 的推荐写法

export default function SomeArray() {
  const inputsRef = useRef([]);

  return (
    <>
      {[1, 2, 3].map((_, i) => (
         {
            if (el) {
              // 挂载:安全赋值
              inputsRef.current[i] = el;
            } else {
              // 卸载:清理引用,防止内存泄漏或 stale node
              inputsRef.current[i] = null;
            }
          }}
        />
      ))}
    
  );
}

关键注意事项

  • 必须添加 key:若省略 key,React 可能复用 DOM 节点,导致 ref 回调被错误触发(例如旧索引收到 null,新索引未及时更新),引发 inputsRef.current 数据错乱;
  • 初始化 ref 数组需谨慎:useRef([]) 是安全的,但不要预先填充 null(如 new Array(3).fill(null)),因为 ref 回调本身已负责状态同步;
  • 避免直接解构或读取未挂载项:访问 inputsRef.current[i] 前应做空值检查(如 if (inputsRef.current[i]) { ...focus() }),尤其在副作用(如 useEffect)中;
  • 替代方案考虑:对动态列表,也可用 useRef>({}) 或结合 useCallback + createRef(),但函数式 ref 仍是标准且最可控的方式。

简言之,null 不是类型缺陷,而是 React 精确控制 DOM 生命周期的契约体现——尊重它,才能写出健壮、可预测的 ref 管理逻辑。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

226

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

430

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

703

2023.08.22

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

2651

2024.08.14

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

30

2025.12.25

错误代码dns_probe_possible
错误代码dns_probe_possible

本专题整合了电脑无法打开网页显示错误代码dns_probe_possible解决方法,阅读专题下面的文章了解更多处理方案。

20

2025.12.25

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

37

2025.12.25

word转换成ppt教程大全
word转换成ppt教程大全

本专题整合了word转换成ppt教程,阅读专题下面的文章了解更多详细操作。

6

2025.12.25

msvcp140.dll丢失相关教程
msvcp140.dll丢失相关教程

本专题整合了msvcp140.dll丢失相关解决方法,阅读专题下面的文章了解更多详细操作。

2

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号