如何更轻松的对React refs 的理解?都有哪些应用场景?

server/2025/1/14 18:17:51/

React refs 的理解与应用

refs 是 React 提供的一种机制,用于直接访问 DOM 元素或 React 组件实例。在 React 中,refs 主要用于获取对 DOM 元素的引用,或访问类组件中的实例方法。在许多情况下,refs 是避免使用传统的 JavaScript 操作 DOM 的一种方式,同时也能解决一些特定场景中的问题,比如:获取输入框的值、管理焦点、动画、或者与第三方库集成。

目录结构:

  1. React refs 的基本概念
  2. refs 的创建方式
  3. 常见的应用场景
    • 3.1 获取 DOM 元素的引用
    • 3.2 管理焦点、文本选择或媒体播放
    • 3.3 集成第三方库
  4. 结合实际项目的代码示例
    • 4.1 获取 DOM 元素并聚焦
    • 4.2 使用 ref 管理组件实例方法
  5. 总结

React refs 的基本概念

refs 是 React 提供的一个 API,允许你获取对 DOM 元素或 React 组件实例的引用。通过 refs,你可以直接操作这些元素或组件,执行例如修改属性、调用方法等操作。它与 React 的声明式 UI 不同,更接近于传统的命令式编程。

refs 的创建方式

在 React 中,可以通过以下方式创建 refs

  1. 使用 React.createRef()(推荐的做法,尤其在类组件中使用):
    React.createRef() 返回一个包含 current 属性的对象,current 属性指向组件的 DOM 元素或实例。

  2. 通过回调函数创建 ref
    在函数组件中,ref 可以通过回调函数来创建。

常见的应用场景

3.1 获取 DOM 元素的引用

最常见的使用场景是直接访问 DOM 元素,例如获取 <input> 元素的值,或者操作一个元素的样式。

3.2 管理焦点、文本选择或媒体播放

当你需要在页面加载时或用户操作时自动聚焦一个输入框、播放一个视频,或者控制一个媒体元素时,refs 是非常有用的。

3.3 集成第三方库

在一些与 React 兼容性差的第三方库中,可能需要通过 refs 来获取 DOM 元素的引用并进行直接操作。


结合实际项目的代码示例

4.1 获取 DOM 元素并聚焦

在一个表单中,假设我们有一个文本框,需要在页面加载时将焦点设置到这个文本框上。可以通过 refs 来实现。

import React, { useEffect, useRef } from 'react';const FocusInput = () => {// 使用 useRef 创建 refconst inputRef = useRef(null);// 使用 useEffect 在组件挂载时聚焦输入框useEffect(() => {inputRef.current.focus();}, []);return (<div><h3>聚焦输入框示例</h3><input ref={inputRef} type="text" placeholder="请输入内容" /></div>);
};export default FocusInput;

解释:

  • useRef 用于创建一个 ref,并将其赋给 <input> 元素。
  • useEffect 中的 inputRef.current.focus() 会在组件加载时将焦点聚焦到输入框。
4.2 使用 ref 管理组件实例方法

refs 也可以用来访问类组件实例,调用组件的实例方法。在函数组件中,我们使用 forwardRefuseImperativeHandle 来暴露组件方法。

假设我们有一个计时器组件,父组件需要控制它的开始和暂停。

// Timer.js
import React, { useState, useEffect, useRef, forwardRef, useImperativeHandle } from 'react';const Timer = forwardRef((props, ref) => {const [time, setTime] = useState(0);const intervalRef = useRef(null);// 暴露给父组件的控制方法useImperativeHandle(ref, () => ({start: () => {if (!intervalRef.current) {intervalRef.current = setInterval(() => {setTime((prevTime) => prevTime + 1);}, 1000);}},stop: () => {if (intervalRef.current) {clearInterval(intervalRef.current);intervalRef.current = null;}},}));useEffect(() => {return () => {if (intervalRef.current) clearInterval(intervalRef.current);};}, []);return <div>计时器: {time} 秒</div>;
});export default Timer;// ParentComponent.js
import React, { useRef } from 'react';
import Timer from './Timer';const ParentComponent = () => {const timerRef = useRef(null);return (<div><h3>父组件控制子组件计时器</h3><button onClick={() => timerRef.current.start()}>开始</button><button onClick={() => timerRef.current.stop()}>停止</button><Timer ref={timerRef} /></div>);
};export default ParentComponent;

解释:

  • Timer 组件中,使用 forwardRefuseImperativeHandle 来暴露 startstop 方法,使得父组件可以控制子组件的行为。
  • 父组件通过 timerRef.current.start()timerRef.current.stop() 来调用子组件的计时器控制方法。

总结

React refs 是一种强大的工具,它使得我们可以直接访问 DOM 元素和组件实例。虽然 refs 有时被认为是"不太 React 化"的方式,但在特定场景下,refs 可以大大简化开发,避免过多的状态管理。常见的应用场景包括获取 DOM 元素、管理焦点、文本选择、集成第三方库等。

关键要点:

  • 使用 refs 时要谨慎,因为它打破了 React 的声明式编程范式。
  • refs 适用于那些无法通过状态管理来处理的需求,如焦点控制和与非 React 代码的交互。

http://www.ppmy.cn/server/158347.html

相关文章

后端:Spring(IOC、AOP)

文章目录 1. Spring2. IOC 控制反转2-1. 通过配置文件定义Bean2-1-1. 通过set方法来注入Bean2-1-2. 通过构造方法来注入Bean2-1-3. 自动装配2-1-4. 集合注入2-1-5. 数据源对象管理(第三方Bean)2-1-6. 在xml配置文件中加载properties文件的数据(context命名空间)2-1-7. 加载容器…

基于单片机的指纹密码锁

【摘要】 本设计是一款基于单片机的指纹识别电子密码锁系统。该系统以STC89C52单片机作为模块核心同时结合ZFM-60指纹模块实现录取指纹并存储指纹数据的功能&#xff0c;并且通过HS12864-15C液晶显示比对流程及比对结果&#xff0c;该指纹电子密码锁通过直流继电器与发光二极管…

小米vela系统(基于开源nuttx内核)——如何使用信号量进行PV操作

如何使用信号量进行PV操作 前言信号量1. 信号量简介2. NuttX中信号量的创建与使用2.1 Nuttx信号量的初始化和销毁2.2 信号量的等待和发布 3. 信号量的实际应用&#xff1a;下载任务示例3.1 实际代码3.2 代码说明3.3 执行说明 4. 信号量的优势与应用场景5. 常见应用场景&#xf…

PyTorch 张量的分块处理介绍

分块处理是将大型张量分解成较小的块&#xff0c;以便更高效地进行计算&#xff0c;减少内存占用&#xff0c;特别适用于处理超大张量的场景&#xff08;如深度学习中的大批量数据或大型模型训练&#xff09;。 PyTorch 提供了多种方法来分块张量&#xff0c;包括 chunk、spli…

c++ haru生成pdf输出文本实例

haru是一个开源的生成pdf的库&#xff0c;花时间终于编译成功&#xff0c;以下是一个特别简单的写文本的实例&#xff1a; #include "hpdf.h" void CDemoDlg::OnBnClickedOk() { HPDF_Error_Handler error_handler NULL; HPDF_Doc pdf; pdf HPDF_New(…

docker run一个镜像如何指定最大可使用的内存大小、cpu大小

在 Docker 中&#xff0c;你可以通过 --memory 和 --cpus 参数来指定容器的最大内存和 CPU 限制。这样可以确保容器不会超出特定的资源限制&#xff0c;从而避免影响主机的其他进程。 1. 限制内存&#xff08;--memory&#xff09; 通过 --memory 或 -m 参数&#xff0c;你可…

Moq与xUnit在C#单元测试中的应用

一、引言&#xff1a;开启单元测试的魔法之旅 嘿&#xff0c;亲爱的编程小伙伴们&#xff01;&#x1f44b; 在软件开发的奇妙世界里&#xff0c;有一项神奇的技术&#xff0c;能为我们的代码保驾护航&#xff0c;让开发过程如虎添翼&#xff0c;那便是单元测试。它宛如给代码…

浅谈云计算07 | 云安全机制

浅谈云计算安全机制&#xff1a;全方位守护云端世界 一、引言二、加密技术&#xff1a;数据的隐形护盾三、散列机制&#xff1a;数据完整性的忠诚卫士四、数字签名&#xff1a;数据来源与真伪的鉴定专家五、公钥基础设施&#xff08;PKI&#xff09;&#xff1a;信任的基石六、…