扫码关注官方订阅号
正文
0
DDD
发布时间:2025-10-11 12:18:09
887人浏览过
来源于php中文网
原创
本文旨在澄清react中“dom组件”的概念,并深入探讨refs在原生dom元素和自定义组件(特别是类组件实例)之间的转发机制。我们将解析官方文档中的常见困惑,并通过示例代码演示如何正确地将refs转发给不同的组件类型,从而帮助开发者更好地利用refs进行dom或组件实例的直接操作。
在React开发中,Refs提供了一种访问DOM节点或React组件实例的方法。它们是处理焦点、文本选择、媒体播放、触发命令式动画以及集成第三方DOM库等场景的关键工具。然而,关于Refs与“DOM组件”以及“类组件实例”之间的关系,特别是React官方文档中的一些表述,有时会引起开发者的困惑。
在React的语境中,当提及“DOM组件”时,通常指的是原生的HTML元素,例如
例如,直接在原生input元素上使用Ref:
import React, { useRef, useEffect } from 'react'; function MyForm() { const inputRef = useRef(null); useEffect(() => { // 在组件挂载后,inputRef.current将指向实际的DOM input元素 if (inputRef.current) { inputRef.current.focus(); // 自动聚焦 } }, []); return ( ); }
在这种情况下,inputRef.current将直接指向原生的HTML DOM元素。
Refs的强大之处在于其转发能力。通过React.forwardRef,父组件可以获取到子组件内部的DOM节点或组件实例的引用。React官方文档中提到:“Ref转发不限于DOM组件。你也可以将Refs转发给类组件实例。”这句话的重点在于区分了Ref可以指向的不同目标类型。
这种区分至关重要。对于函数组件,由于它们没有实例,如果需要将Ref转发到其内部的DOM元素,就必须使用React.forwardRef。对于类组件,Ref可以直接指向其自身实例。
让我们通过一个具体的例子来理解Ref如何转发给类组件实例。假设我们有一个ClassComponent,它内部渲染了一个input元素。我们希望父组件能够获取到这个ClassComponent的实例,或者通过它间接地获取到内部的input元素。
首先,定义一个简单的类组件:
Delphi 7应用编程150例 CHM全书内容下载,全书主要通过150个实例,全面、深入地介绍了用Delphi 7开发应用程序的常用方法和技巧,主要讲解了用Delphi 7进行界面效果处理、图像处理、图形与多媒体开发、系统功能控制、文件处理、网络与数据库开发,以及组件应用等内容。这些实例简单实用、典型性强、功能突出,很多实例使用的技术稍加扩展可以解决同类问题。使用本书最好的方法是通过学习掌握实例中的技术或技巧,然后使用这些技术尝试实现更复杂的功能并应用到更多方面。本书主要针对具有一定Delphi基础知识
import React from 'react'; class ClassComponent extends React.Component { focusInput = () => { // 假设这里有一个内部inputRef,或者直接操作通过props传入的innerRef if (this.props.innerRef && this.props.innerRef.current) { this.props.innerRef.current.focus(); } else { console.log("无法聚焦:innerRef未设置或其current属性为空"); } }; render() { // 将父组件通过innerRef传入的ref附加到内部的input元素上 return ( ); } }
现在,我们创建一个函数组件Input,它将Ref转发给ClassComponent。这里,我们使用React.forwardRef来接收父组件的Ref,并将其作为innerRef属性传递给ClassComponent。
import React from 'react'; // ClassComponent定义如上 // 使用React.forwardRef将Ref转发给ClassComponent const Input = React.forwardRef(function (props, ref) { // 这里的ref是父组件传入的,它将被传递给ClassComponent的innerRef属性 return ; }); // 父组件如何使用这个转发了Ref的Input组件 function ParentComponent() { const classComponentRef = React.useRef(null); const handleClick = () => { if (classComponentRef.current) { // 这里的classComponentRef.current指向ClassComponent内部的input DOM元素 // 因为ClassComponent直接将innerRef附加到了input上 classComponentRef.current.focus(); classComponentRef.current.value = "已聚焦并设置值"; } }; return ( 聚焦并设置输入框 ); } export default ParentComponent;
在这个例子中,ParentComponent通过classComponentRef获取到的实际上是ClassComponent内部的那个input DOM元素的引用,因为ClassComponent直接将innerRef附加到了input元素上。
如果ClassComponent内部不将innerRef附加到DOM元素,而是希望父组件获取到ClassComponent的实例本身呢?
import React from 'react'; class ClassComponentInstance extends React.Component { sayHello = () => { alert("Hello from ClassComponentInstance!"); }; render() { return ( 这是一个类组件实例 ); } } // 父组件直接将Ref附加到ClassComponentInstance function ParentComponentWithInstanceRef() { const instanceRef = React.useRef(null); const handleInstanceClick = () => { if (instanceRef.current) { // 这里的instanceRef.current指向ClassComponentInstance的实例 instanceRef.current.sayHello(); // 调用实例方法 } }; return ( 调用类组件实例方法 ); } export default ParentComponentWithInstanceRef;
这是一个类组件实例
在这个场景中,instanceRef.current将直接指向ClassComponentInstance的实例,允许父组件调用其公共方法(如sayHello)。这正是文档中“你可以将Refs转发给类组件实例”所强调的含义。
理解这些细微的差别对于正确使用Refs至关重要,它能帮助你避免常见的错误,并更灵活地控制React应用中的DOM和组件行为。然而,过度使用Refs可能会导致命令式代码的增加,与React的声明式范式相悖,因此应在必要时才使用Refs。
相关文章
如何在 React Router 中根据路由路径向组件传递环境参数
React 中的组件状态为何在重新挂载后重置?如何实现跨组件持久化状态
React 中的状态持久化:为什么组件重渲染后状态会重置?
React 中列表渲染时 Key 重复警告的解决方案与最佳实践
React Router v6 与 Electron 集成时的路由配置正确写法
相关标签:
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
市场监管总局:2025 年召回问题充电宝 139.77 万台
2026-01-21 16:51
Pandas:跨数据集复用分位数分箱规则对新数据进行分组标注
2026-01-21 16:52
如何高效地将S3中的PNG/JPEG图像流式编码为Base64(无需本地落盘)
2026-01-21 16:54
马航 MH370 航班客机残骸重启搜寻,尚无重大发现
软银发布 AI 数据中心操作系统
台积电产能已证实:苹果今年不发iPhone 18
Firebase 字段名自动添加下划线前缀的解决方案
2026-01-21 16:55
如何在 Tomcat 中正确配置静态 PDF 文件以实现客户端下载
2026-01-21 16:58
如何安全地通过文本输入动态调用指定函数(PHP 教程)
2026-01-21 16:59
玩家认为《赛博朋克2077》不需要快速传送:没有意义!
热门AI工具
DeepSeek
幻方量化公司旗下的开源大模型平台
AI大模型
开放平台
豆包大模型
字节跳动自主研发的一系列大型语言模型
通义千问
阿里巴巴推出的全能AI助手
腾讯元宝
腾讯混元平台推出的AI助手
文档处理
Excel 表格
文心一言
文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。
中文写作
讯飞写作
基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿
写作工具
即梦AI
一站式AI创作平台,免费AI图片和视频生成。
图片拼接
图画生成
ChatGPT
最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。
智谱清言 - 免费全能的AI助手
PC软件
相关专题
html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。
616
2023.06.14
html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。
657
2023.06.21
html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。
470
2023.07.31
html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。
245
2023.08.01
HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。
2898
2023.08.11
在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。
507
html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。
312
2023.08.31
html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。
426
2023.09.01
本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。
9
2026.01.22
热门下载
相关下载
精品课程
共58课时 | 4万人学习
共12课时 | 1.0万人学习
共12课时 | 1万人学习
共6课时 | 9.7万人学习
共79课时 | 151.4万人学习
共6课时 | 53.4万人学习
共4课时 | 13万人学习
共13课时 | 0.9万人学习
最新文章
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部