使用useImperativeHandle时父组件第一次没拿到子组件的问题.docx

使用useImperativeHandle时父组件第一次没拿到子组件的问题.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

使用useImperativeHandle时父组件第一次没拿到子组件的问题

目录用useImperativeHandle父组件第一次没拿到子组件背景需求问题解决方法用useImperativeHandle让父组件操纵子组件的状态和方法

用useImperativeHandle父组件第一次没拿到子组件

背景需求

一个tab两个按钮A、B,默认选中的A,当点击到B时需要显示B对应的图表。

考虑到B的图表在页面加载时已经初始化完成,所以点击B时再调用图表的resize方法。

由于tab中的图表是写在子组件里,所以通过useImperativeHandle实现父组件调用子组件方法,React版本react:^18.1.0,代码如下

父组件:

constchildRef=useRef()

constitem=[{

????name:XXXX,

????content:RunningRecordcRef={childRef}/,

????handClick:childRef.current.resizeChart

return

??……

??li()={

??????setTimeout(()={

????????console.log(~~item.handClick,item.handClick)

????????item.handClick.()

??????},200)

????}}

????key={item.name}

????{item.name}

??/li

??……

??RunningRecordcRef={childRef}/

/

子组件:

functionRunningRecord({cRef}){

??……

??useImperativeHandle(cRef,()=({

????resizeChart:()={dosomething……}

??}))

问题

这样写在本地开发模式中正常运行,但生产环境中父组件首次加载不能拿到子组件的方法,需tab切换到A再次且到B才行。

猜想原因,大概在生产环境中,父组件把子组件暴露出来的方法绑定到UI中的点击事件中,而子组件初始化的时机晚,初始完成后并没有把事件传回来。

这个猜想不一定准确,欢迎知道的小伙伴们补充。

解决方法

在父组件中,将子组件赋值的过程放在useEffect中,不写依赖项参数(不是没有依赖的空数组),再运行,一切正常。

constusageRecordData=[{

??name:XXXX,

??content:RunningRecordcRef={childRef}/,

useEffect(()={

??usageRecordData[1].handClick=childRef.current.resizeChart

})

用useImperativeHandle让父组件操纵子组件的状态和方法

useImperativeHandle是react官方为了简便我们的ref操作,同时还可以让子组件返回给父组件自身的状态和方法去调用

useRef将ref绑定到某个子组件标签上,用以获取整个子组件的方法和参数

useImperativeHandle:可以自定义暴露给父组件的方法或者变量

父组件

importReact,{useState,useRef}fromreact

importChildListfrom./ChildList

exportdefault()={

??letparentRef=useRef(null)

??const[name,setName]=useState(li)

??returndiv

????ChildListparentRef={parentRef}name={name}/ChildList

????button()={

??????console.log(parentRef,parentRef)

????}}获取子组件/button

??/div

}

子组件

importReact,{useImperativeHandle,forwardRef}fromreact

exportdefaultforwardRef(

文档评论(0)

158****7369 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档