0

0

深入理解React Refs:DOM组件、类组件实例与Ref转发机制

聖光之護

聖光之護

发布时间:2025-10-11 11:50:03

|

383人浏览过

|

来源于php中文网

原创

深入理解React Refs:DOM组件、类组件实例与Ref转发机制

本文旨在深入探讨react中refs的工作机制,特别是“dom组件”在refs语境下的确切含义,以及ref转发(ref forwarding)如何应用于原生dom元素和自定义类组件实例。我们将澄清react官方文档中关于ref转发的表述,并通过示例代码展示如何正确地将refs转发至类组件实例,从而帮助开发者更好地理解和应用这一高级特性。

理解React中的Refs

在React中,Refs提供了一种访问在渲染方法中创建的DOM节点或React组件实例的方式。它们通常用于需要直接与底层DOM节点交互的场景,例如管理焦点、文本选择、媒体播放,或者触发命令式动画。

“DOM组件”在Refs语境下的含义

在React文档中,当提及“DOM组件”时,它通常指的是原生HTML元素,例如

Ref转发(Ref Forwarding)机制

Ref转发是React提供的一种技术,允许组件将它收到的Ref向下传递给它的某个子组件,甚至是该子组件内部的原生DOM节点。这在创建可复用组件库时非常有用,因为它允许父组件直接访问子组件内部的DOM节点或组件实例,而无需通过props层层传递回调函数

React.forwardRef是一个高阶组件,它接收一个渲染函数作为参数。这个渲染函数有两个参数:props和ref。

const MyForwardedComponent = React.forwardRef((props, ref) => {
  // 在这里可以使用ref
  return <input ref={ref} {...props} />;
});

Ref转发至原生DOM元素

当Ref转发的目标是原生DOM元素时,ref参数将直接被传递并附加到该DOM元素上。这是最常见的Ref转发场景,例如创建一个自定义的输入框组件,但仍然允许外部直接访问其内部的 DOM节点。

import React from 'react';

// 一个自定义的FancyButton组件,它将接收到的ref转发给内部的button元素
const FancyButton = React.forwardRef((props, ref) => (
  <button ref={ref} className="FancyButton" onClick={props.onClick}>
    {props.children}
  </button>
));

function App() {
  const buttonRef = React.useRef(null);

  const handleClick = () => {
    if (buttonRef.current) {
      buttonRef.current.focus(); // 聚焦到底层button DOM元素
      console.log('Button clicked!');
    }
  };

  return (
    <div>
      <FancyButton ref={buttonRef} onClick={handleClick}>
        聚焦并点击
      </FancyButton>
    </div>
  );
}

export default App;

在这个例子中,buttonRef.current将指向FancyButton组件内部渲染的

Ref转发至类组件实例

React文档中的一个关键点是:“Ref转发不限于DOM组件。你也可以将Refs转发到类组件实例。”这句表述强调了Ref转发的灵活性。当Ref转发的目标是一个自定义的类组件时,传递的ref将指向该类组件的实例,而不是其内部渲染的DOM节点(除非该类组件本身将Ref进一步转发给了其内部的DOM节点)。

Delphi 7应用编程150例 全书内容 CHM版
Delphi 7应用编程150例 全书内容 CHM版

Delphi 7应用编程150例 CHM全书内容下载,全书主要通过150个实例,全面、深入地介绍了用Delphi 7开发应用程序的常用方法和技巧,主要讲解了用Delphi 7进行界面效果处理、图像处理、图形与多媒体开发、系统功能控制、文件处理、网络与数据库开发,以及组件应用等内容。这些实例简单实用、典型性强、功能突出,很多实例使用的技术稍加扩展可以解决同类问题。使用本书最好的方法是通过学习掌握实例中的技术或技巧,然后使用这些技术尝试实现更复杂的功能并应用到更多方面。本书主要针对具有一定Delphi基础知识

下载

这意味着,通过这个Ref,你可以访问类组件实例上的所有方法和属性,例如调用其内部的方法或访问其状态(尽管直接访问组件内部状态通常不推荐)。

为了实现这一点,类组件需要通过props接收这个转发的Ref。通常,我们会将这个Ref命名为innerRef或其他自定义名称,以避免与React内部的ref属性混淆。

以下是一个将Ref转发至类组件实例的示例:

import React from 'react';

// 1. 定义一个类组件
class ClassComponent extends React.Component {
  // 假设这个类组件有一个内部方法
  focusInput() {
    if (this.props.innerRef && this.props.innerRef.current) {
      this.props.innerRef.current.focus();
    }
    console.log('ClassComponent method called!');
  }

  render() {
    // 将接收到的innerRef prop附加到内部的input元素上
    return (
      <input
        value={this.props.value}
        onChange={this.props.onChange}
        placeholder={this.props.placeholder}
        ref={this.props.innerRef} // 这里将外部转发的ref附加到内部input
      />
    );
  }
}

// 2. 使用React.forwardRef将ref转发到ClassComponent
// forwardRef的渲染函数接收props和ref
const Input = React.forwardRef(function (props, ref) {
  // 将外部传入的ref作为innerRef prop传递给ClassComponent
  return <ClassComponent {...props} innerRef={ref} />;
});

// 3. 在父组件中使用转发的Ref
function App() {
  const inputRef = React.useRef(null); // 这个ref将指向ClassComponent的实例

  React.useEffect(() => {
    if (inputRef.current) {
      // 通过ref访问ClassComponent的实例,并调用其方法
      inputRef.current.focusInput(); 
    }
  }, []);

  return (
    <div>
      <Input ref={inputRef} placeholder="请输入内容" />
    </div>
  );
}

export default App;

在这个例子中:

  • App组件创建了一个inputRef。
  • Input组件(通过React.forwardRef创建)接收这个inputRef作为其ref参数。
  • Input组件将这个ref作为innerRef prop传递给ClassComponent。
  • ClassComponent在其render方法中,将this.props.innerRef附加到其内部的元素上。
  • 最终,inputRef.current将指向ClassComponent的实例。通过这个实例,我们就可以调用ClassComponent内部定义的focusInput方法。

关键点:

  • 当Ref转发给一个类组件时,你通过ref.current获得的是该类组件的实例
  • 当Ref转发给一个函数组件时(且该函数组件内部没有使用useImperativeHandle),ref.current通常指向该函数组件内部渲染的DOM节点

总结与注意事项

  1. “DOM组件”的含义:在React Ref语境中,通常指原生HTML元素(如
  2. Ref转发的目的:允许父组件访问子组件内部的DOM节点或组件实例,实现更灵活的组件交互。
  3. Ref转发至原生DOM元素:ref.current将直接指向目标DOM节点。
  4. Ref转发至类组件实例:ref.current将指向目标类组件的实例。这意味着你可以访问该实例上的公共方法和属性。类组件需要通过props(例如innerRef)来接收和使用这个转发的Ref。
  5. Ref转发至函数组件:默认情况下,Ref不能直接附加到函数组件上。需要配合React.forwardRef和(可选的)useImperativeHandle来暴露特定的值或DOM节点。如果函数组件只是将Ref转发给其内部的DOM节点,那么ref.current将指向该DOM节点。
  6. 避免过度使用Refs:Refs主要用于命令式操作,应尽量避免在声明式UI流程中滥用Refs。优先使用props和state来管理组件间的数据流。

通过深入理解Ref转发的这些细微差别,特别是它在处理类组件实例时的行为,开发者可以更有效地利用Refs来解决复杂的交互需求,同时保持React组件的良好封装性

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

4329

2024.08.14

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

197

2023.11.24

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

22

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

48

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

93

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

216

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

413

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

143

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

221

2026.03.03

热门下载

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

精品课程

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

共58课时 | 6万人学习

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

共12课时 | 1万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号