问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

React中父组件如何调用子组件的方法?useImperativeHandle就够了_百度...

发布网友 发布时间:2024-09-25 21:51

我来回答

1个回答

热心网友 时间:2024-10-03 14:21

在React中要实现父组件对子组件的方法调用,离不开对React.forwardRef与useImperativeHandle的理解。如果想直达使用方法,直接看第二点就可以了。如果想要理解透彻,请从开头看起。

1、React.forwardRef:实现ref属性转发

React.forwardRef会创建一个React组件,能将其自身的ref属性转发给其后代组件。

这种技术并不常见,但在以下两种场景中特别有用:

转发refs到DOM组件

在高阶组件中转发refs

React.forwardRef接受一个渲染函数(可理解为一个组件)作为参数。这个函数的参数是props和ref,返回React节点。

constFancyButton=React.forwardRef((props,ref)=>(<buttonref={ref}className="FancyButton">{props.children}</button>));//以下这个ref直接指向<button>。//YoucannowgetarefdirectlytotheDOMbutton:constref=React.createRef();<FancyButtonref={ref}>Clickme!</FancyButton>;

在上述的示例中,React会将<FancyButtonref={ref}>元素的ref作为第二个参数传递给React.forwardRef函数中的渲染函数。该渲染函数会将ref传递给元素。即:FancyButton中的ref传给forwardRef中的ref参数,进而再传给button的ref。

画个图帮助理解:

FancyButton的ref——>FancyButton定义时的forwraRef((props,ref))——><buttonref='ref'>

因此,当React附加了ref属性之后,ref.current将直接指向<button>这个DOM元素实例。

2、useImperativeHandle:将ref的实例传递给父组件。

上面讲述了ref的传递,那么我们这里讲一下如何将子组件的属性、方法传给父组件。

useImperativeHandle(ref,createHandle,[deps])

useImperativeHandle应当与forwardRef一起使用,自定义组件FancyInput,如下:子组件:

importReact,{useRef,useState,useImperativeHandle}from'react';functionFancyInput(props,ref){constinputRef=useRef();useImperativeHandle(ref,()=>({focus:()=>{inputRef.current.focus();}}));return<inputref={inputRef}.../>;}//等同于constFancyInput=React.forwardRef((props,ref){...})FancyInput=forwardRef(FancyInput);

这样写之后,渲染FancyInput?的父组件就可以直接调用inputRef.current.focus()。父组件:

constfanRef=React.useRef();functionhandleClick(){//在这里调用子组件的实例方法。fanRef.current.focus();}<FatherCompoent><FancyInputref={fanRef}/><buttononClick={handleClick}>Focustheinput</button></FatherCompoent>

本文主要参考React中文网,根据自己的理解加以总结。

如有帮助到您,请三连支持一下,欢迎留言。如有不同意见,可在评论区指出,谢谢~

原文:https://juejin.cn/post/7103749617308663816

热心网友 时间:2024-10-03 14:20

在React中要实现父组件对子组件的方法调用,离不开对React.forwardRef与useImperativeHandle的理解。如果想直达使用方法,直接看第二点就可以了。如果想要理解透彻,请从开头看起。

1、React.forwardRef:实现ref属性转发

React.forwardRef会创建一个React组件,能将其自身的ref属性转发给其后代组件。

这种技术并不常见,但在以下两种场景中特别有用:

转发refs到DOM组件

在高阶组件中转发refs

React.forwardRef接受一个渲染函数(可理解为一个组件)作为参数。这个函数的参数是props和ref,返回React节点。

constFancyButton=React.forwardRef((props,ref)=>(<buttonref={ref}className="FancyButton">{props.children}</button>));//以下这个ref直接指向<button>。//YoucannowgetarefdirectlytotheDOMbutton:constref=React.createRef();<FancyButtonref={ref}>Clickme!</FancyButton>;

在上述的示例中,React会将<FancyButtonref={ref}>元素的ref作为第二个参数传递给React.forwardRef函数中的渲染函数。该渲染函数会将ref传递给元素。即:FancyButton中的ref传给forwardRef中的ref参数,进而再传给button的ref。

画个图帮助理解:

FancyButton的ref——>FancyButton定义时的forwraRef((props,ref))——><buttonref='ref'>

因此,当React附加了ref属性之后,ref.current将直接指向<button>这个DOM元素实例。

2、useImperativeHandle:将ref的实例传递给父组件。

上面讲述了ref的传递,那么我们这里讲一下如何将子组件的属性、方法传给父组件。

useImperativeHandle(ref,createHandle,[deps])

useImperativeHandle应当与forwardRef一起使用,自定义组件FancyInput,如下:子组件:

importReact,{useRef,useState,useImperativeHandle}from'react';functionFancyInput(props,ref){constinputRef=useRef();useImperativeHandle(ref,()=>({focus:()=>{inputRef.current.focus();}}));return<inputref={inputRef}.../>;}//等同于constFancyInput=React.forwardRef((props,ref){...})FancyInput=forwardRef(FancyInput);

这样写之后,渲染FancyInput?的父组件就可以直接调用inputRef.current.focus()。父组件:

constfanRef=React.useRef();functionhandleClick(){//在这里调用子组件的实例方法。fanRef.current.focus();}<FatherCompoent><FancyInputref={fanRef}/><buttononClick={handleClick}>Focustheinput</button></FatherCompoent>

本文主要参考React中文网,根据自己的理解加以总结。

如有帮助到您,请三连支持一下,欢迎留言。如有不同意见,可在评论区指出,谢谢~

原文:https://juejin.cn/post/7103749617308663816
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
亮黄色和枚红色的包包哪个更好搭? 我的华硕X54H为什么只有2G内存,双核1.6GHz的处理器呢??? 我觉得我笔记本电脑买贵了,华硕x54hr买了四千,我觉得亏死了,大家说说我... 对方没有打开私信通知是什么意思 腰腹环吸要多少钱腰腹环吸的危害 腰腹环吸疼吗腰腹环吸疼痛感什么时候消失 全国高考使用全国卷后分数线每个省都是一样的吗 幼儿园标准是什么样的 幼儿园应该如何挑选呢? 一所好幼儿园的标准是什么样的 国产的男士香水有哪些味道比较持久? 我的电脑是win7的系统,自带的计算器被我删了,怎么恢复 高夫哪个系列 着惊的词语着惊的词语是什么 御天武帝好看吗 梦见别人抢我钱什么意思(梦见别人抢我钱什么意思) 我的腘窝起了一个肿瘤!病理切片结果为,网状型血管内皮瘤,请问谁知道... 对流传热系数特征数用什么表示 pr常数Pr常数是多少 胆囊多发息肉样病变0.4严重吗 胆囊壁息肉样病变是什么意思 pr常数? 什么是“胆囊息肉”或“隆起性病变” 普朗特数指的是 鸱吻现实建筑证据 胆囊隆起性病变是什么意思 璜门是什么意思? 帝王凤阙是什么意思? Win11使用mklink转移C:\Users文件夹至非系统盘 注意,网上说藏红花可以有效快速淡斑祛斑是真的吗 大学毕业改名字,所以要去江苏省教育厅进行学历认证,请问要带哪些材料... Windows defender启动类型选项变灰是为什么? 怎样关闭威胁防护?win10关闭病毒和威胁防护的详细步骤 请问小皮面条怎样? 为什么刷机包放不到目录根里 喹啉铜和可杀得能混用吗 钢笔水弄到手上怎么去除 手机锁住了如何刷机啊手机锁住了怎么刷机? 老外要看我的审计报告,我没有,该怎么回啊 巧战500万:福彩3d与体彩排列三中奖绝招目录 银行卡4年时间不用自动销户吗? 选购彩票有什么妙招吗? 淘宝猜你喜欢怎么玩? 区块链怎么看大户(区块链怎么查询账户余额) 一片一片abab式的词语 家里的无线网用的好好的但是突然之间就断了,而在重新连接的时候发现找不... 电饭锅做蛋糕的教程 哪里有艾斯奥特曼变身的GIF的的图片 勇者斗恶龙11暮鼓晨钟攻略介绍_勇者斗恶龙11暮鼓晨钟攻略是什么_百度知 ... 艾斯奥特曼哪些集好看