React和Vue中暴露子组件的属性和方法给父组件用,并且控制子组件暴露的颗粒度的做法
React
在 React 中,forwardRef 是一种高级技术,它允许你将 ref 从父组件传递到子组件,从而直接访问子组件的 DOM 节点或公开的方法。这对于需要操作子组件内部状态或 DOM 的场景非常有用。为了使子组件能够暴露其属性和方法给父组件,通常会结合 useImperativeHandle Hook 使用 forwardRef。
如何使用 forwardRef 和 useImperativeHandle
-
创建一个带有
forwardRef的子组件:- 使用
React.forwardRef来创建一个接受ref参数的组件。
- 使用
-
使用
useImperativeHandle定义要暴露的方法和属性:- 在子组件中使用
useImperativeHandle来定义哪些方法或属性应该通过ref暴露出去。
- 在子组件中使用
-
在父组件中使用
ref来访问子组件的公开接口:- 创建一个
ref并将其传递给子组件,然后通过这个ref访问子组件暴露的方法或属性。
- 创建一个
示例代码
子组件 (ChildComponent.js)
import React, { useRef, useImperativeHandle, forwardRef } from 'react';const ChildComponent = forwardRef((props, ref) => {const inputRef = useRef(null);// 定义要暴露的方法useImperativeHandle(ref, () => ({focusInput: () => {inputRef.current.focus();console.log('子组件的输入框获得了焦点');},getInputValue: () => inputRef.current.value,}));return (<div><input ref={inputRef} type="text" placeholder="这是子组件的输入框" /></div>);
});export default ChildComponent;
父组件 (ParentComponent.js)
import React, { useRef } from 'react';
import ChildComponent from './ChildComponent';const ParentComponent = () => {const childComponentRef = useRef(null);const handleFocus = () => {if (childComponentRef.current) {childComponentRef.current.focusInput();}};const handleGetValue = () => {if (childComponentRef.current) {const value = childComponentRef.current.getInputValue();console.log('子组件的输入值:', value);}};return (<div><ChildComponent ref={childComponentRef} /><button onClick={handleFocus}>让子组件的输入框获得焦点</button><button onClick={handleGetValue}>获取子组件的输入值</button></div>);
};export default ParentComponent;
解释
-
子组件 (
ChildComponent.js):- 使用
forwardRef创建了一个接受ref参数的组件。 - 使用
useImperativeHandle定义了focusInput和getInputValue方法,并将它们绑定到传入的ref上。这意味着父组件可以通过ref访问这些方法。
- 使用
-
父组件 (
ParentComponent.js):- 创建了一个
ref(childComponentRef) 并将其传递给ChildComponent。 - 提供了两个按钮,分别用于调用子组件的
focusInput和getInputValue方法。
- 创建了一个
这种方法确保了父组件可以安全地与子组件进行交互,同时保持良好的封装性。通过 useImperativeHandle,你可以精确控制哪些方法或属性是公开的,而不会意外地暴露不必要的实现细节。
Vue
当你通过 ref 获取到子组件的根 DOM 元素后,你可以使用标准的 DOM API 来访问或操作该元素及其子元素。如果你想要访问 <p> 标签,可以通过多种方式实现,具体取决于你想要进行的操作。
访问子元素的方法
-
使用
querySelector或querySelectorAll:- 这些方法允许你根据选择器(如标签名、类名、ID 等)来查找特定的子元素。
-
遍历子节点:
- 你可以使用
children、childNodes或其他类似属性来遍历子节点。
- 你可以使用
-
直接访问特定子元素:
- 如果你知道子元素的具体位置,可以直接通过
firstElementChild、lastElementChild等属性访问。
- 如果你知道子元素的具体位置,可以直接通过
示例代码
假设你想在父组件中访问并打印子组件中的 <p> 标签的内容,可以按照以下方式修改你的代码:
子组件 (ChildComponent.vue)
<template><div ref="root"><p id="content">这是子组件的内容</p></div>
</template><script setup>
import { defineExpose, ref } from 'vue';const root = ref(null);// 使用 defineExpose 显式暴露给父组件的方法或属性
defineExpose({getRootEl: () => root.value,
});
</script>
父组件 (ParentComponent.vue)
<template><ChildComponent ref="childComponent" /><button @click="handleClick">点击我</button>
</template><script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';const childComponent = ref(null);const handleClick = () => {if (childComponent.value) {// 调用子组件的公开方法来获取 DOM 引用const el = childComponent.value.getRootEl();// 使用 querySelector 查找 <p> 标签const pElement = el.querySelector('p#content');console.log('子组件的 <p> 内容:', pElement?.textContent);}
};
</script>
解释
-
子组件 (
ChildComponent.vue):- 我们为
<p>标签添加了一个id="content",以便更容易地通过querySelector查找它。
- 我们为
-
父组件 (
ParentComponent.vue):- 在
handleClick方法中,我们首先调用getRootEl获取子组件的根元素。 - 然后,使用
querySelector方法通过 ID 选择器查找<p>标签,并打印其文本内容。这里使用了可选链操作符 (?.) 来安全处理可能为null的情况。
- 在
这种方法确保了你能够以一种安全且可控的方式访问子组件内部的特定 DOM 元素。请记住,尽量减少对 DOM 的直接操作,除非确实有必要。保持尽可能多的逻辑在 Vue 的响应式系统内,这样可以使应用更加高效和易于维护。
相关文章:
React和Vue中暴露子组件的属性和方法给父组件用,并且控制子组件暴露的颗粒度的做法
React 在 React 中,forwardRef 是一种高级技术,它允许你将 ref 从父组件传递到子组件,从而直接访问子组件的 DOM 节点或公开的方法。这对于需要操作子组件内部状态或 DOM 的场景非常有用。为了使子组件能够暴露其属性和方法给父组件…...
uniapp 常用的指令语句
uniapp 是一个使用 Vue.js 开发的跨平台应用框架,因此,它继承了 Vue.js 的大部分指令。以下是一些在 uniapp 中常用的 Vue 指令语句及其用途: v-if / v-else-if / v-else 条件渲染。v-if 有条件地渲染元素,v-else-if 和 v-else 用…...
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
【1】引言 前序已经对BGR图像和HSV图像的转换进行了基本讨论,相关文章链接为: python学opencv|读取图像(十二)BGR图像转HSV图像-CSDN博客 python学opencv|读取图像(十三)BGR图像和HSV图像互相转换深入-C…...
C# 结构体和类
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、类(Class)二、结构体(Struct)示例代码(定义类和结构体)类的继承代码示例(…...
D9741是一块脉宽调制方三用于也收路像机和笔记本电的等设备上的直流转换器。在便携式的仪器设备上。
概述: D9741是一块脉宽调制方三用于也收路像机和笔记本电的等设备上的直流转换器。在便携式的仪器设备上。 主要特点: ● 高精度基准电路 ● 定时闩锁、短路保护电路 ● 低电压输入时误操作保护电路 ● 输出基准电压(2.5V) ● 超过工作范围能进行自动校…...
题目 1738: 排序
题目 1738: 排序 时间限制: 2s 内存限制: 96MB 提交: 14351 解决: 3477 题目描述 对输入的n个数进行排序并输出。 输入格式 输入的第一行包括一个整数n(1<n<100)。 接下来的一行包括n个整数。 输出格式 可能有多组测试数据,对于每组数据,将排序后…...
爬虫逆向学习(十四):分享一下某数通用破解服务开发经验
阅前须知 这篇博客不是教大家怎么实现的,而且告知大家有这个东西,或者说一种趋势,借此分享自己大致的实现经验。具体的实现我也不好整理,毕竟是在别人的基础上缝缝补补。 前言 使用补环境方式破解过某数的同学都知道࿰…...
《Vue进阶教程》第十一课:响应式系统介绍
1 什么是响应式 当数据改变时, 引用数据的函数会自动重新执行 2 手动完成响应过程 首先, 明确一个概念: 响应式是一个过程, 这个过程存在两个参与者: 一方触发, 另一方响应 比如说, 我们家小胖有时候不乖, 我会打他, 他会哭. 这里我就是触发者, 小胖就是响应者 同样, 所谓…...
rpc设计的再次思考20251215(以xdb为核心构建游戏框架)
1.服务提供者注册的方式 // 表明这是一个服务提供者,ServerType 和 ServerId从application.properties中读取 // 而且只有当当前服务是Game时,才生效。 或者 条件注解??? RpcProvider(typeServerType.Game) public class GameProvider{MsgReceiver…...
pydub AudioSegment增加音频文件音量并保存- python 实现
DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…...
IT 新突破!远程控制电脑技术造就工作与学习新方向!
远程控制电脑技术的历史可追溯到计算机网络的早期时代。最初,通过电话线和调制解调器的组合,实现了远程访问,这是远程控制电脑技术的雏形。随着互联网技术的飞速发展,远程控制电脑技术也日趋完善,并在多个领域得到了广…...
LabVIEW起落架震台检测
在现代飞机制造与维护过程中,起落架的性能测试是保障飞机安全的重要环节。通过LabVIEW开发的起落架小落震台检测系统,通过模拟飞机着陆过程,准确捕捉起落架在着陆时承受的各种动力学特性和应力响应,有效提升起落架设计的精度与可靠…...
Day24 C++ 接口(抽象类)
C 接口(抽象类) 接口描述了类的行为和功能,而不需要完成类的特定实现。 C 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。 如果类中至少有一个函数被声明…...
UE5 关于画质、机能与开发成本的思考
1、并不省时间 UE5等工具优点是可以通过一些工具与资源快速获得较好的画面,节约一些时间, 但缺点也很多, 一个是各种精度的素材之间的协调问题,参差不齐,统一升级到高精度会产生较大的成本, 一个是资源…...
IOS学习路线图
iOS是由苹果公司开发的移动操作系统。 苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad上。iOS与苹果的macOS操作系统一样,属于类Unix的商业操作系统。原本这个系统名为…...
HICE-day6
二层交换 交换基础 所谓的二层交换机指的是针对数据的二层头部(以太网帧头)中的MAC地址进行寻址并转发数据的交换设备。二层交换机不具备路由功能,它工作在OSI七层模型的第二层,因此被称为二层交换机。 上图中,PC1、…...
第100+33步 ChatGPT学习:时间序列EMD-ARIMA-LSTM模型
基于Python 3.9版本演示 一、写在前面 上一节,我们学了经验模态分解(Empirical Mode Decomposition,EMD)。 如同结尾所说,“那么,做这些分解有什么作用呢?有大佬基于这些分解出来的序列分别作…...
(C语言)双向链表
目录 链表的分类 双向链表的实现 1)定义链表 2)初始化双向链表 3)申请节点 4)尾插 5)头插 6)打印链表 7)尾删 8)头插 9)查找 10)指定位置删除 11…...
青少年编程与数学 02-004 Go语言Web编程 04课题、接收和处理请求
青少年编程与数学 02-004 Go语言Web编程 04课题、接收和处理请求 课题摘要:一、构建WEB服务器1. 安装Go语言2. 创建项目结构3. 编写代码4. 运行WEB服务器5. 访问WEB服务器 二、接收请求1. 定义处理函数(Handler)2. 将处理函数与路由关联3. 启动服务器4. …...
Unity全局光照详解
之前就学过但是太久没用又忘了,因此用最简洁易懂的语言做个记录。 全局光照分为两个系统,分别是实时光照和混合光照。(点击window/Rendering/Lighing打开此面板) 其中全局光照对于我来说都是新技术了,上一次学…...
九成中老年为之困扰:隐秘的足部护理刚需,正催生一条翻倍增长赛道
拆解银发足部经济的掘金逻辑作者 | AgeClub任子勋前言中老年足部护理,这个长期游离在大众视野之外的隐秘需求,正促成一桩热门生意。在城市商圈、社区街道上,路人经常能遇到大小不过10余平米的足部护理店。这些门店鲜有网络营销造势࿰…...
负载锌酞菁(ZnPc)/α-萘酚温敏水凝胶,ZnPc/α-Naphthol
名称:负载锌酞菁(ZnPc)/α-萘酚温敏水凝胶,ZnPc/α-Naphthol 一、材料概览:双重功能的精妙融合 负载锌酞菁(ZnPc)/α-萘酚温敏水凝胶,是将具有优异光催化活性的锌酞菁(Zn…...
别再踩坑了!手把手教你解决RPM安装时的‘.rpm.lock’事务锁定报错
RPM事务锁机制深度解析:从原理到避坑实战 在Linux系统管理中,RPM包管理器的.rpm.lock报错堪称经典"拦路虎"——据统计,超过63%的运维人员至少遭遇过一次这类锁定问题。这个看似简单的错误背后,隐藏着RPM设计精妙的事务隔…...
3分钟终极指南:如何将任何网页一键转换为Figma设计稿?
3分钟终极指南:如何将任何网页一键转换为Figma设计稿? 【免费下载链接】figma-html Convert any website to editable Figma designs 项目地址: https://gitcode.com/gh_mirrors/fi/figma-html 你是否经常遇到这样的困扰:看到一个设计…...
从74LS00与非门到74LS86异或门:手把手教你用面包板搭建数字电路基础实验(附波形分析)
从74LS00与非门到74LS86异或门:面包板上的数字电路实战指南 在电子技术的浩瀚海洋中,数字电路犹如一座连接现实与虚拟的桥梁。对于初学者而言,从理论到实践的跨越往往充满挑战——实验室里昂贵的设备、复杂的接线、固定的实验流程,…...
DeepSeek SSO性能压测实录:单集群支撑5000+并发登录的4大调优阈值(含Prometheus监控指标基线)
更多请点击: https://intelliparadigm.com 第一章:DeepSeek SSO单点登录性能压测全景概览 DeepSeek SSO 作为企业级统一身份认证中枢,其在高并发场景下的响应延迟、会话稳定性与令牌签发吞吐能力直接决定下游所有业务系统的可用性边界。本章…...
别再截图了!用AD21把PCB 3D模型直接塞进PDF,客户评审一目了然
用AD21将PCB 3D模型嵌入PDF:提升设计评审效率的终极方案 在硬件开发流程中,设计评审环节往往成为项目推进的瓶颈。传统方式下,工程师不得不反复截取多角度2D图纸,或录制繁琐的演示视频,既耗费时间又难以全面展示设计细…...
Windows上运行安卓应用:APK安装器完整指南
Windows上运行安卓应用:APK安装器完整指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上直接运行安卓应用,却不想安装笨重的…...
Windows缩略图加载太慢?这款智能预加载工具让文件浏览快如闪电
Windows缩略图加载太慢?这款智能预加载工具让文件浏览快如闪电 【免费下载链接】WinThumbsPreloader-V2 WinThumbsPreloader is a powerful open source tool for quickly preloading thumbnails in Windows Explorer. 项目地址: https://gitcode.com/gh_mirrors/…...
CANN/Ascend C Tanh临时缓冲区因子大小获取接口
GetTanhTmpBufferFactorSize 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: htt…...
