【React】详解如何获取 DOM 元素

文章目录

    • 一、基础概念
      • 1. 什么是DOM?
      • 2. 为什么需要获取DOM?
    • 二、使用 `ref` 获取DOM元素
      • 1. 基本概念
      • 2. 类组件中的 `ref`
      • 3. 函数组件中的 `ref`
    • 三、 `ref` 的进阶用法
      • 1. 动态设置 `ref`
      • 2. `ref` 与函数组件的结合
    • 四、处理特殊情况
      • 1. 多个 `ref` 的处理
      • 2. `ref` 与条件渲染

在React中,操作DOM是一个常见但经常让人感到困惑的任务。虽然React鼓励使用虚拟DOM来优化性能和简化开发,但有时你仍然需要直接访问实际的DOM元素来完成特定任务。本文将详细介绍在React中获取DOM元素的各种方法,包括基本的 ref 使用、函数组件中的 ref,以及如何在React Hooks中利用 useRef。通过本文,你将全面了解如何在React中高效、安全地获取和操作DOM元素。

一、基础概念

1. 什么是DOM?

DOM(文档对象模型)是HTML和XML文档的编程接口。它将文档表示为一个由节点构成的树形结构,每个节点代表文档中的一个部分,比如元素、属性或文本。在React中,虽然大多数操作通过虚拟DOM进行,但有时你仍然需要直接操作实际的DOM节点。

2. 为什么需要获取DOM?

在React中,通常推荐使用虚拟DOM来处理用户界面更新,但某些情况下你可能需要直接访问DOM节点。例如:

  • 当与第三方库集成时,需要直接操作DOM。
  • 在进行动画时,可能需要访问实际的DOM节点。
  • 实现自定义UI组件时,有时需要直接操作DOM。

二、使用 ref 获取DOM元素

1. 基本概念

在React中,ref 是一个特殊的属性,用于引用DOM节点或类组件实例。通过 ref,你可以在函数组件或类组件中访问实际的DOM元素。

2. 类组件中的 ref

在类组件中,可以使用 React.createRef() 创建 ref,并将其附加到一个DOM元素上:

import React, { Component } from 'react';class MyComponent extends Component {constructor(props) {super(props);this.myRef = React.createRef();}componentDidMount() {// 通过 this.myRef.current 访问实际的DOM节点console.log(this.myRef.current);}render() {return (<div><input ref={this.myRef} type="text" /></div>);}
}export default MyComponent;

在上面的示例中:

  • React.createRef() 创建了一个 ref 对象。
  • this.myRef 被附加到 <input> 元素上。
  • componentDidMount 生命周期方法中,你可以通过 this.myRef.current 访问到实际的DOM节点。

3. 函数组件中的 ref

在函数组件中,可以使用 useRef Hook 来创建 ref

import React, { useRef, useEffect } from 'react';function MyComponent() {const inputRef = useRef(null);useEffect(() => {// 通过 inputRef.current 访问实际的DOM节点console.log(inputRef.current);}, []);return (<div><input ref={inputRef} type="text" /></div>);
}export default MyComponent;

在这个示例中:

  • useRef 创建了一个 ref 对象,初始值为 null
  • inputRef 被附加到 <input> 元素上。
  • useEffect Hook 在组件挂载后运行,可以通过 inputRef.current 访问到实际的DOM节点。

三、 ref 的进阶用法

1. 动态设置 ref

在某些情况下,你可能需要根据条件动态设置 ref

import React, { useRef, useEffect } from 'react';function MyComponent({ isFocused }) {const inputRef = useRef(null);useEffect(() => {if (isFocused && inputRef.current) {inputRef.current.focus();}}, [isFocused]);return (<div><input ref={inputRef} type="text" /></div>);
}export default MyComponent;

在这个示例中:

  • useEffect 会在 isFocused 变化时执行。
  • 如果 isFocusedtrue,则会使 inputRef.current 获取焦点。

2. ref 与函数组件的结合

你也可以将 ref 传递给子组件:

import React, { forwardRef, useRef, useImperativeHandle } from 'react';const ChildComponent = forwardRef((props, ref) => {useImperativeHandle(ref, () => ({alertMessage() {alert('Hello from ChildComponent!');}}));return <div>Child Component</div>;
});function ParentComponent() {const childRef = useRef(null);const handleClick = () => {if (childRef.current) {childRef.current.alertMessage();}};return (<div><ChildComponent ref={childRef} /><button onClick={handleClick}>Call Child Component</button></div>);
}export default ParentComponent;

在这个示例中:

  • ChildComponent 使用 forwardRefuseImperativeHandle 定义了可供父组件调用的 ref 方法。
  • ParentComponent 可以通过 childRef.current.alertMessage() 调用子组件中的方法。

四、处理特殊情况

1. 多个 ref 的处理

当需要在同一个组件中管理多个 ref 时,可以使用多个 useRef 或创建一个对象来存储多个 ref

import React, { useRef, useEffect } from 'react';function MyComponent() {const refs = {inputRef1: useRef(null),inputRef2: useRef(null)};useEffect(() => {console.log(refs.inputRef1.current);console.log(refs.inputRef2.current);}, []);return (<div><input ref={refs.inputRef1} type="text" placeholder="Input 1" /><input ref={refs.inputRef2} type="text" placeholder="Input 2" /></div>);
}export default MyComponent;

在这个示例中:

  • refs 对象存储了多个 ref
  • 可以通过 refs.inputRef1.currentrefs.inputRef2.current 访问不同的DOM节点。

2. ref 与条件渲染

在条件渲染的情况下,可能需要处理 ref 的存在性:

import React, { useRef, useEffect, useState } from 'react';function MyComponent() {const [isVisible, setIsVisible] = useState(true);const inputRef = useRef(null);useEffect(() => {if (isVisible && inputRef.current) {console.log('Input is visible:', inputRef.current);}}, [isVisible]);return (<div>{isVisible && <input ref={inputRef} type="text" />}<button onClick={() => setIsVisible(!isVisible)}>Toggle Input</button></div>);
}export default MyComponent;

在这个示例中:

  • 使用 useState 控制 <input> 的显示和隐藏。
  • useEffect 检查 isVisibleinputRef.current 的状态来确保 ref 只在 <input> 可见时有效。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/50878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32F103的FreeRTOS系列(四)·FreeRTOS资料获取以及简介

目录 1. FreeRTOS简介 1.1 FreeRTOS介绍 1.2 为何选择FreeRTOS 1.3 FreeRTOS资料获取 1.3.1 官网下载 1.3.2 Github下载 1.3.3 托管网站下载 1.4 FreeRTOS的编程风格 1.4.1 数据类型 1.4.2 变量名 1.4.3 函数名 1.4.4 宏 1. FreeRTOS简介 1.1 Free…

11. Hibernate 持久化对象的各种状态

1. 前言 本节课和大家聊聊持久化对象的 3 种状态。通过本节课程&#xff0c;你将了解到&#xff1a; 持久化对象的 3 种状态&#xff1b;什么是对象持久化能力。 2. 持久化对象的状态 程序运行期间的数据都是存储在内存中。内存具有临时性。程序结束、计算机挂机…… 内存中…

Web前端浅谈ArkTS组件开发

本文由JS老狗原创。 有幸参与本厂APP的鸿蒙化改造&#xff0c;学习了ArkTS以及IDE的相关知识&#xff0c;并有机会在ISSUE上与鸿蒙各路大佬交流&#xff0c;获益颇丰。 本篇文章将从一个Web前端的视角出发&#xff0c;浅谈ArkTS组件开发的基础问题&#xff0c;比如属性传递、插…

hamcrest 断言框架使用示例和优势分析

引言 在软件测试领域&#xff0c;断言是验证代码行为是否符合预期的关键环节。Hamcrest 断言框架&#xff0c;以其独特的匹配器&#xff08;Matcher&#xff09;概念和清晰的失败信息&#xff0c;赢得了广泛的赞誉。尽管 Python 标准库中没有内置的 Hamcrest 库&#xff0c;但…

【Linux】-----工具篇(编译器gcc/g++,调试器gdb)

目录 一、gcc/g 简单认识 程序的翻译过程认识gcc 预处理(宏替换) 编译 汇编 链接 宏观认识 如何理解&#xff08;核心&#xff09; 什么是链接&#xff1f; 链接的分类 二、gdb 基本的认识 基本操作及指令 安装gdb 启动gdb ​编辑 显示源代码(list) 运行程序…

SQL labs-SQL注入(三,sqlmap使用)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 引言&#xff1a; 盲注简述&#xff1a;是在没有回显得情况下采用的注入方式&#xff0c;分为布尔盲注和时间盲注。 布尔盲注&#xff1a;布尔仅有两种形式&#xff0c;ture&#…

学习笔记:MySQL数据库操作3

1. 创建数据库和表 创建数据库 mydb11_stu 并使用该数据库。创建 student 表&#xff0c;包含字段&#xff1a;学号&#xff08;主键&#xff0c;唯一&#xff09;&#xff0c;姓名&#xff0c;性别&#xff0c;出生年份&#xff0c;系别&#xff0c;地址。创建 score 表&…

C#、Net6、WebApi报表方案

目录 1 Pdf表单方案 1.1出现如下错误提示: 1.2 字体路径使用 2 Docx报表模板方案 2.1 pdf方案缺陷 2.2 解决方案 3 Spire.Doc报表方案 3.1 Docx方案缺陷 3.2 解决方案 4 插入复选框 5 WebApi文件流下载接口 6 软件获取方式 1 Pdf表单方案 使用【Adobe Acrobat P…

python—pandas基础(2)

文章目录 列操作修改变量列筛选变量列使用.loc[]&#xff08;基于标签)使用.iloc[]&#xff08;基于整数位置&#xff09;使用.filter()方法 删除变量列添加变量列 变量类型的转换Pandas 支持的数据类型在不同数据类型间转换 建立索引新建数据框时建立索引读入数据时建立索引指…

Vue---vue3+vite项目内使用devtools,快速开发!

背景 我们在前期开发时&#xff0c;一般使用chrome或者edge浏览器&#xff0c;会使用vue-devtools或react-devtools&#xff08;此插件个人未使用&#xff0c;可百度下是否可内嵌入项目&#xff01;&#xff09;来审查vue项目&#xff1b;这个需要安转浏览器插件才可支持&…

使用PyTorch导出JIT模型:C++ API与libtorch实战

PyTorch导出JIT模型并用C API libtorch调用 本文将介绍如何将一个 PyTorch 模型导出为 JIT 模型并用 PyTorch 的 CAPI libtorch运行这个模型。 Step1&#xff1a;导出模型 首先我们进行第一步&#xff0c;用 Python API 来导出模型&#xff0c;由于本文的重点是在后面的部署…

【odoo17】后端py方法触发右上角提示组件

概要 在前面文章中&#xff0c;有介绍过前端触发的通知服务。 【odoo】右上角的提示&#xff08;通知服务&#xff09; 此文章则介绍后端触发方法。 内容 直接上代码&#xff1a;但是前提一定是按钮触发&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; def bu…

【css】实现扫光特效

对于要重点突出的元素&#xff0c;我们经常可以看到它上面打了一个从左到右的斜向扫光&#xff0c;显得元素亮闪闪的&#xff01;类似于下图的亮光动效 关键步骤 伪元素设置position :absolute【也可以不用伪元素&#xff0c;直接创建一个absolute元素盖在上面】设置渐变line…

Mike21粒子追踪模型particle tracking如何展示粒子轨迹

前言&#xff1a; 随着模型的推广&#xff0c;模型的很多模块也问的多了起来&#xff0c;PT粒子追踪模块最近群友也在问&#xff0c;结果算了出来&#xff0c;却实现不了展示运动轨迹。今天就写段简单的PT后处理的方法吧。 注意&#xff1a;MIKE21输出模块中不但输出了关于水…

Axure怎么样?全面功能评测与用户体验分析!

软件 Axure 曾经成为产品经理必备的原型设计工具&#xff0c;被认为是专门为产品经理设计的工具。但事实上&#xff0c;软件 Axure 的使用场景并不局限于产品经理构建产品原型。UI/UX 设计师还可以使用 Axure 软件构件应用程序 APP 原型&#xff0c;网站设计师也可以使用 Axure…

如何系统的学习C++和自动驾驶算法

给大家分享一下我的学习C和自动驾驶算法视频&#xff0c;收藏订阅都很高。打开下面的链接&#xff0c;就可以看到所有的合集了&#xff0c;订阅一下&#xff0c;下次就能找到了。 【C面试100问】第七十四问&#xff1a;STL中既然有了vector为什么还需要array STL中既然有了vec…

QSqlQuery增删改查

本文记录使用QSqlQuery实现增删改查的过程。 目录 1. 构建表格数据 声明变量 表格、数据模型、选择模型三板斧设置 列表执行查询 列表的水平表头设置 2. 新增一行 构建一个空行 通过dialog返回的修改行数据&#xff0c;update更新 3. 更新一行 获取到需要更新的行 通…

Spring Bean - xml 配置文件创建对象

类型&#xff1a; 1、值类型 2、null &#xff08;标签&#xff09; 3、特殊符号 &#xff08;< -> < &#xff09; 4、CDATA <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/bea…

信息安全技术解析

在信息爆炸的今天&#xff0c;信息技术安全已成为社会发展的重要基石。随着网络攻击的日益复杂和隐蔽&#xff0c;保障数据安全、提升防御能力成为信息技术安全领域的核心任务。本文将从加密解密技术、安全行为分析技术和网络安全态势感知技术三个方面进行深入探讨&#xff0c;…

WPF启动失败报System.Windows.Automation.Peers.AutomationPeer.Initialize()错误解决

问题描述 win10系统上WPF程序启动后就崩溃&#xff0c;通过查看崩溃日志如下&#xff1a; 应用程序: xxx.exe Framework 版本: v4.0.30319 说明: 由于未经处理的异常&#xff0c;进程终止。 异常信息: System.TypeLoadException 在 System.Windows.Automation.Peers.Automatio…