react中如何获取真实的dom

在 React 中,获取真实的 DOM 元素通常通过 ref 来实现。ref 是一个特殊的属性,用于引用组件或 DOM 元素的实例。你可以通过 ref 获取到组件的真实 DOM 元素或组件实例。

1. 函数组件中的 useRef

在函数组件中,获取 DOM 元素的引用需要使用 useRef 钩子。

示例:函数组件中的 useRef 用法
import React, { useRef } from 'react';function MyComponent() {// 创建一个 ref 来引用 DOM 元素const inputRef = useRef(null);const focusInput = () => {// 通过 ref 访问真实的 DOM 元素,并给它添加焦点inputRef.current.focus();};return (<div><input ref={inputRef} type="text" /><button onClick={focusInput}>Focus the input</button></div>);
}export default MyComponent;

解释:

  • useRef 返回一个包含 .current 属性的对象,current 可以指向真实的 DOM 元素(或者组件实例,具体取决于 ref 的用途)。
  • 在这个例子中,inputRef.current 会指向 <input> 元素本身,你可以通过它访问 DOM 元素的属性和方法(例如 focus())。

2. 类组件中的 createRef

在类组件中,获取 DOM 元素的引用需要使用 React.createRef() 方法。

示例:类组件中的 createRef 用法
import React, { Component } from 'react';class MyComponent extends Component {// 在类组件中创建 refconstructor(props) {super(props);this.inputRef = React.createRef();}focusInput = () => {// 通过 ref 访问真实的 DOM 元素,并给它添加焦点this.inputRef.current.focus();};render() {return (<div><input ref={this.inputRef} type="text" /><button onClick={this.focusInput}>Focus the input</button></div>);}
}export default MyComponent;

解释:

  • React.createRef() 用于在类组件中创建一个 ref 对象,this.inputRef.current 指向 DOM 元素(在此例中是 <input> 元素)。
  • focusInput 方法通过 this.inputRef.current.focus() 调用 DOM 方法来聚焦输入框。

3. 访问 DOM 元素的常见用途

  • 获取输入框的值:你可以通过 ref 获取到输入框的值,虽然在大多数情况下,React 推荐使用受控组件来管理输入框的值,但有时直接访问 DOM 元素可能更简单。

    示例:

    function MyComponent() {const inputRef = useRef(null);const handleSubmit = () => {alert(`Input value: ${inputRef.current.value}`);};return (<div><input ref={inputRef} type="text" /><button onClick={handleSubmit}>Submit</button></div>);
    }
    
  • 控制焦点ref 可以用来控制元素的焦点(如前面的例子),让用户能够交互时快速导航到特定的输入框。

  • DOM 操作:你还可以直接操作 DOM 元素的其他属性,如添加事件监听器、获取元素尺寸、滚动等。

4. 使用 ref 获取自定义组件的实例

除了 DOM 元素,ref 还可以用来获取类组件的实例。

示例:获取类组件实例
import React, { Component } from 'react';class MyButton extends Component {clickHandler() {alert('Button clicked!');}render() {return <button onClick={this.clickHandler}>Click Me</button>;}
}class ParentComponent extends Component {constructor(props) {super(props);this.buttonRef = React.createRef();}triggerButtonClick = () => {this.buttonRef.current.clickHandler(); // 调用子组件的方法};render() {return (<div><MyButton ref={this.buttonRef} /><button onClick={this.triggerButtonClick}>Trigger Child Button Click</button></div>);}
}export default ParentComponent;

解释:

  • this.buttonRef.current 会指向子组件 MyButton 的实例,因此你可以直接调用它的方法(如 clickHandler())。
  • ref 对于类组件和函数组件的使用方式略有不同,但它们的核心思想相同:通过 ref 获取实例或 DOM 元素的引用。

5. 注意事项

  • 避免过度使用 ref:在 React 中,ref 是一种“逃逸机制”,它绕过了 React 的数据流和状态管理。尽量避免在没有必要的情况下使用 ref,推荐使用 React 的状态和 props 来管理数据和交互。
  • ref 只在渲染完成后有效ref 只能在组件渲染完成后访问到 DOM 元素。因此,在 componentDidMountuseEffect 中使用 ref 时,要确保渲染已经完成。

总结:

  • 函数组件 中,使用 useRef 来获取真实的 DOM 元素。
  • 类组件 中,使用 React.createRef() 来获取真实的 DOM 元素。
  • ref 用于访问 DOM 元素或组件实例,可以用于获取值、控制焦点或执行其他 DOM 操作。

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

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

相关文章

关于“前端已死”的命题

翻阅知乎论坛&#xff0c;看了各位大佬的解析&#xff0c;从技术发展、市场环境、岗位需求三个维度综合理解这个命题&#xff1a; 1. 技术层面 前端技术生态并未停滞&#xff0c;反而持续迭代升级。HTML/CSS/JavaScript 核心基础未变&#xff0c;但框架&#xff08;如 Vue、R…

Docker Compose:编排多容器应用

1. 什么是 Docker Compose? Docker Compose 是一个用于定义和管理多容器 Docker 应用的工具。它通过一个简单的配置文件(docker-compose.yml),让你能够在一个命令下启动、停止和管理多个容器。这使得在开发、测试和生产环境中,管理复杂的应用变得更加简单。 Docker Comp…

(2025)深度分析DeepSeek-R1开源的6种蒸馏模型之间的逻辑处理和编写代码能力区别以及配置要求,并与ChatGPT进行对比(附本地部署教程)

(2025)通过Ollama光速部署本地DeepSeek-R1模型(支持Windows10/11)_deepseek猫娘咒语-CSDN博客文章浏览阅读1k次&#xff0c;点赞19次&#xff0c;收藏9次。通过Ollama光速部署本地DeepSeek-R1(支持Windows10/11)_deepseek猫娘咒语https://blog.csdn.net/m0_70478643/article/de…

Ubuntu安装geteck/jetlinks实战:源码启动

这个还是很复杂的&#xff0c;建议使用docker即可。 参考 使用源码启动JetLinks | JetLinks 物联网基础平台 安装Ubuntu虚拟机&#xff08;略&#xff09;安装JDK8编译Redis安装mysql ubuntu安装MySqL server-CSDN博客 初次使用&#xff0c;不要安装ElasticSearch下载源码…

【docker知识】快速找出服务器中占用内存较高的容器

本文由Markdown语法编辑器编辑完成。 1.背景&#xff1a; 近期在处理现场问题&#xff0c;观察服务器时&#xff0c;会遇到某些进程占用较高内存的情况。由于我们的服务&#xff0c;基本上都是以容器的方式在运行&#xff0c;因此就需要找到&#xff0c;到底是哪个容器&#…

Jenkins 安装插件 二

Jenkins 安装插件 二 一. 打开 Dashboard 打开 Jenkins 界面&#xff0c;不管在任何界面&#xff0c;只需要点击左上角 Dashboard 按钮即可 二. 打开 Manage Jenkins 找到 Manage Jenkins -> System Configuration -> Plugins 点击 Plugins 打开界面如下 Updates&a…

OpenCV机器学习(1)人工神经网络 - 多层感知器类cv::ml::ANN_MLP

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::ml::ANN_MLP 是 OpenCV 库中的一部分&#xff0c;用于实现人工神经网络 - 多层感知器&#xff08;Artificial Neural Network - Multi-Layer…

Qt中的事件

写一个 可以拖动的按钮 DraggablePushButton.h 头文件 #ifndef DRAGGABLEPUSHBUTTON_H #define DRAGGABLEPUSHBUTTON_H#include <QPushButton> #include <QMouseEvent>class DraggablePushButton : public QPushButton {Q_OBJECTpublic:explicit DraggablePushBu…

Postgresql 开发环境搭建指南(WindowsLinux)

一、Postgresql 简介 PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS)&#xff0c;在灵活的BSD许可证下发行。 RDBMS 是关系数据库管理系统&#xff0c;是建立实体之间的联系&#xff0c;最后得到的是关系表。 ORDBMS在原来关系数据库的基础上&#xff0c;增加了一些新…

2025前端面试题

2025前端面试题 uniappuniapp如何打包发版到线上 vuevue3构建项目vue如何封装组件vue2的响应式原理vue3的响应式原理vue3和2的区别Vuex中的重要核心属性有哪些&#xff1f;Vue-router有哪几种路由守卫 es6数组有哪些常用方法ES6的新特性Promiseasync/await防抖和节流&#xff0…

大语言模型多代理协作(MACNET)

大语言模型多代理协作(MACNET) Scaling Large-Language-Model-based Multi-Agent Collaboration 提出多智能体协作网络(MACNET),以探究多智能体协作中增加智能体数量是否存在类似神经缩放定律的规律。研究发现了小世界协作现象和协作缩放定律,为LLM系统资源预测和优化…

dify.ai 配置链接到阿里云百练等云厂商的 DeepSeek 模型

要将 dify.ai 配置链接到阿里云百练等云厂商的 DeepSeek 模型. 申请阿里云百练的KEY 添加模型 测试模型

Win10环境使用Dockerdesktop部署Dify集成Deepseek

Win10环境借助Dockerdesktop部署Dify集成Deepseek 前言 之前笔者已经部署了基于Ollama的Deepseek&#xff1a; https://lizhiyong.blog.csdn.net/article/details/145505686 安装官方指示&#xff0c;还可以集成很多组件拓展玩法&#xff1a; https://github.com/deepseek…

23、深度学习-自学之路-激活函数relu、tanh、sigmoid、softmax函数的正向传播和反向梯度。

在使用这个非线性激活函数的时候&#xff0c;其实我们重点还是学习的是他们的正向怎么传播&#xff0c;以及反向怎么传递的。 如下图所示&#xff1a; 第一&#xff1a;relu函数的正向传播函数是&#xff1a;当输入值&#xff08;隐藏层&#xff09;值大于了&#xff0c;就输出…

cameralib 安装

目录 linux安装&#xff1a; 测试安装是否成功&#xff1a; linux安装&#xff1a; pip install githttps://github.com/isarandi/cameralib.git pip install githttps://github.com/isarandi/boxlib.git pip install githttps://github.com/isarandi/poseviz.git githttps…

ML.NET库学习005:基于机器学习的客户细分实现与解析

文章目录 ML.NET库学习005&#xff1a;基于机器学习的客户细分实现与解析项目主要目的和原理目的原理 项目概述实现的主要功能主要流程步骤使用的主要函数方法关键技术 主要功能和步骤功能详细解读详细步骤解析 数据集及其处理步骤数据集处理步骤关键处理步骤原理1. 数据清洗与…

webpack打包优化策略

1. 减少打包体积 减少打包文件的大小是为了提高加载速度&#xff0c;降低网络带宽消耗&#xff0c;提升用户体验。常见的减少打包体积的优化策略包括&#xff1a; 代码分割&#xff08;Code Splitting&#xff09;&#xff1a;将代码拆分成多个小文件&#xff0c;让浏览器按需…

RocketMQ与kafka如何解决消息积压问题?

前言 消息积压问题简单来说&#xff0c;就是MQ存在了大量没法快速消费完的数据&#xff0c;造成消息积压的原因主要在于“进入的多&#xff0c;消费的少”&#xff0c;或者生产的速度过快&#xff0c;而消费速度赶不上&#xff0c;基于这一问题&#xff0c;我们主要介绍如何通过…

RISC-V平台编译 state-thread x264 ffmpeg zlog

1.state-threads 源码下来之后 直接 make linux-debug 目录下生成了对应的.a 和 .h文件 gcc test.c -o test -l st -L . #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/socket.h&g…

用easyExcel如何实现?

要使提供的 ExcelModelListener 类来解析 Excel 文件并实现批量存储数据库的功能&#xff0c;需要结合 EasyExcel 库来读取 Excel 数据。具体来说&#xff0c;可以使用 EasyExcel.read() 方法来读取 Excel 文件&#xff0c;并指定 ExcelModelListener 作为事件监听器。 下面是…