React获取DOM元素全解析:掌握Refs与Hook核心用法
一、React中获取DOM元素的背景与核心思想1.1 为什么需要获取DOM元素React的核心思想是声明式渲染与虚拟DOM, 通常情况下我们不需要直接操作真实DOM。但在某些特定场景下, 我们仍然需要直接获取真实的DOM节点来进行命令式操作。这些场景包括但不限于: (1) 管理焦点, 文本选择或媒体播放; (2) 触发强制动画; (3) 集成第三方DOM库 (如D3.js, Chart.js等)。1.2 Refs的核心概念与工作流程React提供了Refs来访问真实DOM节点或React组件实例。Refs是一个可变对象, 其current属性被初始化为传入的初始值。当Ref被挂载到DOM节点上时, React会将该节点的引用赋值给ref.current; 当组件卸载时, React会将其重置为null。以下是Refs工作流程的直观展示:创建Ref对象将ref属性绑定到JSX节点React挂载组件将DOM节点赋值给ref.current通过ref.current访问DOM执行命令式操作1.3 获取DOM元素的几种主流方式在React中获取DOM元素主要有以下几种主流方式: (1) 函数组件中使用useRef Hook; (2) 类组件中使用React.createRef; (3) 使用回调Refs; (4) 使用forwardRef转发Ref给子组件。下面我们将逐一详细展开。二、函数组件中获取DOM元素2.1 使用useRef Hook创建Ref对象在函数组件中, 获取DOM元素最推荐的方式是使用useRef Hook。useRef返回一个可变的ref对象, 其current属性被初始化为传入的参数。具体操作步骤如下:引入useRef并创建ref对象。将ref对象绑定到DOM元素的ref属性。在事件处理函数中通过ref.current访问真实DOM。代码示例如下:import React, { useRef } from react; function TextInput() { const inputRef useRef(null); const focusInput () { inputRef.current.focus(); }; return ( div input ref{inputRef} typetext / button onClick{focusInput}聚焦输入框/button /div ); }2.2 useRef结合回调与副作用操作有时我们需要在组件挂载后立即对DOM元素进行测量或操作, 这时可以结合useEffect使用。操作步骤如下:创建ref对象并绑定到目标DOM。在useEffect的回调函数中访问ref.current。执行如获取宽度等DOM测量操作。代码示例如下:import React, { useRef, useEffect } from react; function MeasureBox() { const divRef useRef(null); useEffect(() { if (divRef.current) { const width divRef.current.getBoundingClientRect().width; console.log(DOM元素宽度:, width); } }, []); return div ref{divRef} style{{ width: 100px, height: 100px, backgroundColor: skyblue }}测量我/div; }2.3 函数组件中转发Ref (forwardRef)默认情况下, 函数组件没有实例, 因此无法直接通过ref属性获取函数组件内部的DOM。如果需要让父组件获取子函数组件内的DOM, 需要使用React.forwardRef进行转发。操作步骤如下:使用React.forwardRef包裹子函数组件。将传入的ref参数绑定到子组件内部的DOM元素。在父组件中创建ref并传递给子组件。代码示例如下:import React, { useRef, forwardRef } from react; const CustomInput forwardRef((props, ref) { return input ref{ref} typetext placeholder{props.placeholder} /; }); function ParentComponent() { const childRef useRef(null); const handleClick () { childRef.current.focus(); }; return ( div CustomInput ref{childRef} placeholder请输入 / button onClick{handleClick}聚焦子组件输入框/button /div ); }三、类组件中获取DOM元素3.1 使用React.createRef获取DOM在类组件中, 推荐使用React.createRef来创建Ref对象。操作步骤如下:在构造函数中通过React.createRef()创建ref对象。将ref对象绑定到render方法返回的DOM元素上。在componentDidMount等生命周期中通过this.myRef.current访问DOM。代码示例如下:import React, { Component } from react; class AutoFocusInput extends Component { constructor(props) { super(props); this.inputRef React.createRef(); } componentDidMount() { this.inputRef.current.focus(); } render() { return input ref{this.inputRef} typetext /; } }3.2 使用回调Refs获取DOM回调Refs是另一种获取DOM的方式。操作步骤如下:编写一个接收DOM节点作为参数的函数。将该函数作为ref属性传递给DOM元素。在函数内部将DOM节点存储到组件实例的属性上以供后续使用。代码示例如下:import React, { Component } from react; class CallbackRefInput extends Component { constructor(props) { super(props); this.setInputRef element { this.inputElement element; }; } componentDidMount() { if (this.inputElement) { this.inputElement.focus(); } } render() { return input ref{this.setInputRef} typetext /; } }3.3 类组件中Ref的传递与层级访问在类组件中, 如果父组件需要访问子组件内部的DOM节点, 操作步骤如下:父组件创建ref对象并传递给子组件的ref属性。子组件如果是类组件, 父组件获取的ref将指向子组件实例。父组件通过ref.current调用子组件暴露的方法, 间接操作子组件内部的DOM。代码示例如下:import React, { Component } from react; class ChildInput extends Component { constructor(props) { super(props); this.state { value: }; } focus () { this.input.focus(); } render() { return input ref{el this.input el} typetext /; } } class ParentForm extends Component { constructor(props) { super(props); this.childRef React.createRef(); } handleClick () { this.childRef.current.focus(); } render() { return ( div ChildInput ref{this.childRef} / button onClick{this.handleClick}调用子组件方法/button /div ); } }

相关新闻

树莓派驱动9.7英寸电子墨水屏:IT8951芯片SPI通信与驱动开发全解析

树莓派驱动9.7英寸电子墨水屏:IT8951芯片SPI通信与驱动开发全解析

1. 项目概述:一块9.7英寸电子墨水屏的“帽子”如果你手头有一块树莓派,并且厌倦了传统LCD屏幕的刺眼背光和持续功耗,那么给树莓派戴上一顶“电子纸帽子”会是一个极具极客范儿的选择。我最近上手了一块名为“9.7inch e-Paper HAT”的扩展板&a…

2026/10/9 17:30:03 阅读更多 →
步进电机速度控制:从脉冲频率计算到梯形/S形曲线实战

步进电机速度控制:从脉冲频率计算到梯形/S形曲线实战

1. 项目概述:从脉冲到转速的精确掌控搞电机控制,尤其是步进电机,最核心也最让人头疼的问题之一就是速度控制。你可能会想,不就是给脉冲嘛,脉冲给得快,电机就转得快。话是没错,但具体怎么个快法&…

2026/10/2 21:27:45 阅读更多 →
从CTF实战剖析SQL注入:原理、手动利用与安全防御

从CTF实战剖析SQL注入:原理、手动利用与安全防御

1. 项目概述:从一道CTF题看SQL注入的本质最近在带新人入门网络安全,发现很多朋友对SQL注入的理解还停留在“万能密码”或者工具扫描的阶段。正好手头有一道经典的CTF入门题,来自某个技能树的“[第一章 web入门]SQL注入-1”。这道题麻雀虽小&a…

2026/10/2 14:05:33 阅读更多 →

最新新闻

单片机毕设选题推荐:基于ESP32的智能垃圾桶舵机开盖与声光报警装置设计 基于单片机的红外感应垃圾桶自动控制系统设计(031101)

单片机毕设选题推荐:基于ESP32的智能垃圾桶舵机开盖与声光报警装置设计 基于单片机的红外感应垃圾桶自动控制系统设计(031101)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/10/11 3:10:25 阅读更多 →
【单片机课程设计/毕业设计】基于红外感应的智能垃圾桶自动开盖控制系统设计 基于ESP32的垃圾桶红外感应开盖与满溢报警装置设计(031101)

【单片机课程设计/毕业设计】基于红外感应的智能垃圾桶自动开盖控制系统设计 基于ESP32的垃圾桶红外感应开盖与满溢报警装置设计(031101)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/10/11 3:10:25 阅读更多 →
MIPI-DSI点屏实战:从D-PHY物理层到初始化调试全解析

MIPI-DSI点屏实战:从D-PHY物理层到初始化调试全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 3:10:25 阅读更多 →
YOLOv11+DeepSORT实战:十字路口多目标追踪与IDF1优化

YOLOv11+DeepSORT实战:十字路口多目标追踪与IDF1优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 3:10:25 阅读更多 →
RK3588以太网BSP调试实战:从设备树到RGMII时序调优

RK3588以太网BSP调试实战:从设备树到RGMII时序调优

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 3:10:25 阅读更多 →
Python 多行字符串缩进难题:PEP 822 自动缩进移除语法解析

Python 多行字符串缩进难题:PEP 822 自动缩进移除语法解析

最近 Python 社区的讨论氛围很特别,除了版本迭代,有一个新方向被越来越多人拿出来聊:PEP 822 提案。看到“自动缩进移除的多行字符串”这个提法,我第一反应是“早该有人做这事了”。说起来,Python 的字符串系统已经足够…

2026/10/11 3:09:24 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →