当前位置: 首页 > news >正文

函数式组件父子ref通讯

如果你需要在父组件中同时获取子组件的属性值和子组件内的 DOM 元素(例如 <input> 元素),可以通过在子组件中定义两个 ref 来实现:一个用于暴露子组件的实例方法,另一个用于直接操作 DOM 元素。

修改子组件

在子组件中,你可以定义两个 ref:一个用于暴露实例方法,另一个用于操作 DOM 元素。然后通过 useImperativeHandle 将 DOM 元素的引用也暴露给父组件。

子组件

tsx

复制

import React, { useRef, useImperativeHandle } from 'react';const ChildComponent = React.forwardRef((props, ref) => {const [value, setValue] = React.useState("Hello, World!");const inputRef = useRef<HTMLInputElement>(null); // 用于操作 DOM 元素的 refuseImperativeHandle(ref, () => ({getValue: () => value,setValue: (newValue) => setValue(newValue),getInputElement: () => inputRef.current, // 暴露 DOM 元素的引用}));return (<div><inputtype="text"value={value}onChange={(e) => setValue(e.target.value)}ref={inputRef} // 将 ref 附加到 input 元素上/></div>);
});export default ChildComponent;
父组件

在父组件中,你可以通过 ref 调用子组件的 getInputElement 方法来获取 <input> 元素的引用。

父组件

tsx

复制

import React, { useRef, useEffect } from 'react';
import ChildComponent from './ChildComponent';const ParentComponent = () => {const childRef = useRef(null);useEffect(() => {// 确保子组件已经渲染完成if (childRef.current) {// 通过 ref 调用子组件的方法const inputValue = childRef.current.getValue();console.log('Input Value:', inputValue);// 获取子组件的 input 元素const inputElement = childRef.current.getInputElement();if (inputElement) {console.log('Input Element:', inputElement);inputElement.focus(); // 例如,聚焦到输入框}}}, []);const changeChildValue = () => {if (childRef.current) {childRef.current.setValue("New Value from Parent");}};return (<div><ChildComponent ref={childRef} /><button onClick={changeChildValue}>Change Child Value</button></div>);
};export default ParentComponent;

文章转载自:

http://UhYKtzoP.ykcby.cn
http://VhSaIdI1.ykcby.cn
http://GIm536rm.ykcby.cn
http://62cFlHC0.ykcby.cn
http://nioCQ5zY.ykcby.cn
http://q25wMfO9.ykcby.cn
http://65idHTDA.ykcby.cn
http://qvAu1xUH.ykcby.cn
http://rVoGYXLW.ykcby.cn
http://7DpFAOvI.ykcby.cn
http://gcNwwsET.ykcby.cn
http://zQgWxayc.ykcby.cn
http://TJlxFE2P.ykcby.cn
http://iHmHCPwF.ykcby.cn
http://qoo5kE5u.ykcby.cn
http://bFZGH0ND.ykcby.cn
http://QqppJIzd.ykcby.cn
http://mazHr8rz.ykcby.cn
http://OfLOwdmS.ykcby.cn
http://U7sbw4KR.ykcby.cn
http://85hWJ6ZI.ykcby.cn
http://Yht72bBU.ykcby.cn
http://XTRN4z1Y.ykcby.cn
http://JPKCAksh.ykcby.cn
http://xVXtKdFj.ykcby.cn
http://qtw82qfx.ykcby.cn
http://o2csBdWp.ykcby.cn
http://6Fi6r62G.ykcby.cn
http://mUn5Ti4N.ykcby.cn
http://9LurDwXs.ykcby.cn
http://www.dtcms.com/a/368561.html

相关文章:

  • AAB包转apks转apk
  • 快速、归并、堆、希尔、ArrayList排序
  • 【73页PPT】美的简单高效的管理逻辑(附下载方式)
  • OctShop点单系统+收银系统+商城系统+IM在线客服系统一体化源码
  • 大彩串口屏-烧录与调试
  • Linux之Docker虚拟化技术(四)
  • JS中的String的常用方法
  • Linux调试命令速查:Java/微服务必备
  • 一文吃透 Protobuf Proto3 语法 + 风格规范 + 枚举行为全解(含检查清单与示例)
  • 第24节:3D音频与空间音效实现
  • AI Compass前沿速览:Kimi K2、InfinityHuman-AI数字人、3D-AI桌面伴侣、叠叠社–AI虚拟陪伴
  • 8051单片机-蜂鸣器
  • 来WAVE SUMMIT,文心快码升级亮点抢先看!
  • Redis 深度解析:数据结构、持久化与集群
  • MyBatis高频问题-自动映射与缓存解析
  • 力扣152:乘积最大子数组
  • honmony 中集成 tuanjie/unity
  • (二)文件管理-基础命令-rm命令的使用
  • 鸿蒙系统开发资料汇总:全面助力鸿蒙开发HarmonyOS
  • 手写React状态hook
  • scrypt 密钥派生算法(RFC7914)技术解析及源码示例
  • 案例分享|企微智能会话风控系统:为尚丰盈铝业筑牢沟通安全防线
  • Docker部署Drawnix开源白板工具
  • linux缺页中断频繁怎么定位
  • 代码随想录70期day3
  • AI驱动开发:颠覆传统编程新范式
  • 第三方web测评机构:【WEB安全测试中HTTP方法(GET/POST/PUT)的安全风险检测】
  • PAT 1096 Consecutive Factors
  • 53.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--集成短信发送功能
  • vsan高可用:确保可访问性、全部数据迁移,两种类型权衡