如何在 React 初始渲染时通过 useRef 获取 DOM 元素的值

梦强小哥_6069

梦强小哥_6069

2026-07-05

181人浏览

原创

如何在 React 初始渲染时通过 useRef 获取 DOM 元素的值

本文详解如何正确使用 useRef 与 React.forwardRef 在组件首次渲染后读取 DOM 节点(如 input)的初始值,避免因 ref 未正确转发导致的 null 或警告问题。

本文详解如何正确使用 `useref` 与 `react.forwardref` 在组件首次渲染后读取 dom 节点(如 input)的初始值,避免因 ref 未正确转发导致的 `null` 或警告问题。

在 React 函数组件中,若需在初始渲染后访问原生 DOM 元素(例如获取 的 defaultValue 或当前值),必须确保 ref 被正确传递并绑定到实际 DOM 节点上。你遇到的错误——"ref is not a prop" 和 name 输出为 null——根本原因在于:普通函数组件无法直接接收并转发 ref;必须显式使用 React.forwardRef。

✅ 正确做法:用 forwardRef 包裹子组件

FormRow 是一个自定义封装组件,它内部渲染 ,但默认不支持 ref 透传。你需要将其改写为 forwardRef 组件,并将 ref 参数直接绑定到 上:

import React from "react";

const FormRow = React.forwardRef(
  ({ type, name, labelText, defaultValue = "", onChange, onBlur, max }, ref) => {
    return (
      <div classname="form-row">
        <label htmlfor="{name}" classname="form-label">
          {labelText || name}
        </label>
        <input autocomplete="off" type="{type}" id="{name}" name="{name}" classname="form-input" defaultvalue="{defaultValue}" required onchange="{onChange}" onblur="{onBlur}" max="{max}" min="0" ref="{ref}" input>
</div>
    );
  }
);

export default FormRow;

⚠️ 注意:forwardRef 的第二个参数是 ref,它不是 props 的一部分,因此不能解构到 { ref } 中——必须作为独立参数接收。

Dagre React Flow
Dagre React Flow

使用 dagre 与 React Flow (@xyflow/react) 实现自动图布局。适用于自动布局、层级布局、树形结构或节点排列等场景。

下载

✅ 在父组件中安全读取 DOM 值

在 AddProject 中,useRef 创建的引用对象本身不是值,而是包含 .current 属性的对象。且 useEffect 必须添加空依赖数组 [],确保只在挂载后执行一次(即“初始渲染后”):

const AddProject = () => {
  const refContainer = useRef(null);

  useEffect(() => {
    // ✅ 确保 DOM 已挂载,且 ref 已绑定
    if (refContainer.current) {
      console.log("Initial input value:", refContainer.current.value); // 输出 defaultValue="1"
      // 也可读取其他属性,如 refContainer.current.defaultValue
    }
  }, []); // ? 依赖数组为空,仅执行一次

  return (
    <wrapper><form>
        <formrow type="number" name="noOfChemicals" labeltext="Number of Chemicals / Work Items" onchange="{handleChange}" defaultvalue="1" ref="{refContainer}"></formrow>
</form>
    </wrapper>
  );
};

export default AddProject;

? 关键要点总结

  • ref 不是普通 prop,不可在解构参数中直接写 { ref },必须用 forwardRef 显式接收;
  • useRef().current 初始为 null,务必在 useEffect 中检查 ref.current 是否存在,再访问其属性(如 .value, .defaultValue);
  • 若需读取 defaultValue(即初始设定值),可用 refContainer.current.defaultValue;若需读取渲染后实际显示的值(含用户未修改前的状态),用 .value 即可;
  • useEffect 的依赖数组 [] 是保证“仅初始渲染后执行”的关键,避免重复执行或竞态问题。

遵循以上模式,即可稳健、清晰地在 React 中实现 DOM 值的初始读取。

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

5455

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3132

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

2790

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

2819

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4699

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

2781

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

2569

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2308

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2328

5

热门下载

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

精品课程

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

共58课时 | 12.1万人学习

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

共12课时 | 1.4万人学习