React中使用TS完成父组件调用子组件的操作方法

 更新时间:2023年07月13日 11:09:00   作者:离逝的枫  
由于在项目开发过程中,我们往往时需要调用子组件中的方法,这篇文章主要介绍了React中使用TS完成父组件调用子组件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

1.需求

由于在项目开发过程中,我们往往时需要调用子组件中的方法。例如管理系统中的添加,就需要我们调用添加表单时展示的方法。从而实现页面的展示。在vue中我们知道可以给组件上添加ref从而获取到组件的实例对象。那么在React中我们该怎么办呢、

2.页面

2.1父组件

下面就是我们的父组件,其实就是类似于一个网站的头部,当我们点击用户登录时,就需要将我们写登录逻辑的页面展示出来。因此我们就需要调用对应的Ref从而帮助我们操作对应的子组件的方法。

const WebHeader = () => {
const ModelRef = useRef<IFnChildInstance>(null)
const ChildrenFn = ModelRef.current!
function userLogin(){
ChildrenFn.showModal()
console.log(ChildrenFn.showModal)
}
return (
<div className="header-container fx fa">
<div className="wrapper fx jb fa">
<div className="left-wrapper fx fa">
<img src="http://syt.atguigu.cn/_nuxt/img/logo.7086376.png" alt="网站loge" style={{width:'50px'}}/>
<span className='text link'>尚医通 预约挂号统一平台</span>
</div>
<div className="right-wrapper fx jb">
<span className='link-to'>帮助中心</span>
<span className='link-to' onClick={userLogin}>登录注册</span>
<Child ref={ModelRef}></Child>
</div>
</div>
</div>
)
}

2.2 子组件

这里的子组件就超级简单了,我们就只是在这里定义了一个弹窗从而实现登录的逻辑。这里就只是简单的将子组件中的弹出的方法暴露给父组件,从而让父组件点击登录的时候可以展开我们对应的子组件。

const Child = forwardRef<IFnChildInstance>((props,ref) => {
const [isModalOpen, setIsModalOpen] = useState(false);
useImperativeHandle(ref, () => ({
showModal, //(实际等于: resetSharePopup:resetSharePopup)
}));
function showModal(){
setIsModalOpen(true);
};
return(
<Modal title="Basic Modal" open={isModalOpen}>
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</Modal>
)
})

3.实现逻辑

3.1 父组件中构建ref

由于我们需要获取到对应的子组件的ref,因此我们首先需要在父组件中获取到对应的。由于我们这里定义的是函数式组件,因此在这里我们就使用了对应的hooks,如useRef。因为这里我们使用了TS,因此我们对创建的Ref进行了类型的限制。

const ModelRef = useRef<IFnChildInstance>(null)

因为在这里我们主要是获取子组件中打开弹窗的方法,因此我们采取的是只是暴露方法,而不需要将DOM元素暴露出来。因此其中的IFnChildInstance就是我们定义的接口类型。其中的showModal的类型是一个无返回值的函数。然后我们将定义好的ref放在对应的组件,到这里我们的父组件中所实现的相关操作已经完成了。

interface IFnChildInstance {
        showModal: () => void,
}
//组件引用的地方
<Child ref={ModelRef}></Child>

3.2子组件中的相关操作

首先我们需要使用的是forwardRef来进行向外暴露。下面是官方文档中对其的介绍。

forwardRef 允许你的组件使用 ref 将一个 DOM 节点暴露给父组件。

forwardRef(render)

使用 forwardRef() 来让你的组件接收一个 ref 并将其传递给一个子组件:

import { forwardRef } from 'react';
const MyInput = forwardRef(function MyInput(props, ref) {
// ...
});
  • props:父组件传递过来的参数。
  • ref:父组件传递的 ref 属性。ref 可以是一个对象或函数。如果父组件没有传递一个 ref,那么它将会是 null。你应该将接收到的 ref 转发给另一个组件,或者将其传递给 useImperativeHandle
  • 对应的官方文档的链接如下,需要的可以跳转过去仔细查看forwardRef – React

回归正题,我们这里就使用forwardRef来进行对应的创建。代码如下。由于我们在父组件中传递的ref所对应的类型是IFnChildInstance,因此我们在这里接收的时候也要进行变量类型的生命。然后由于我们子组件只需要将其对应的方法暴露给父组件中操作,而不是将整个DOM元素给父组件,因此我们可以使用useImperativeHandle来进行操作。其中对应的具体使用方法可以点击上面的连接进行查看。这里就只是简单阐述了,第一个参数接收的是函数传递的ref,第二个使我们想向外暴露的方法。该参数的类型是一个函数,因此这里我们就使用了赋值的心事。第三个参数是一个数组,具体的使用方法还请查看官方文档。然后我们还需要在子组件中定义所传递给父组件中的方法。注意的是其函数的类型要和我们所定义的ref的类型一样,否则TS会给我们报错提示。

const Child = forwardRef<IFnChildInstance>((props,ref) => {
const [isModalOpen, setIsModalOpen] = useState(false);
useImperativeHandle(ref, () => ({
showModal, //(实际等于: resetSharePopup:resetSharePopup)
}));
function showModal(){
setIsModalOpen(true);
};
return(
<Modal title="Basic Modal" open={isModalOpen}>
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</Modal>
)
})

4.父组件使用

然后我们就可以通过父组件中定义的接口useRef的变量中的.current属性来获取我们子组件中传递返回的对象,其中就是我们所定义返回的函数。然后我们就只需要在合适的地方将其调用即可。

const ModelRef = useRef<IFnChildInstance>(null)
  const ChildrenFn = ModelRef.current!
  function userLogin(){
    ChildrenFn.showModal()
   console.log(ChildrenFn.showModal)

5.总结

首先我们需要使用useRef来创建对应的ref的值,但是我们需要给对应的值定义接口。其中接口的信息就是我们想往外暴露的值

然后再对应的组件上使用ref来进行获取对应的标签

然后在子组件中我们需要使用forwardRef向外暴露一个可操作的ref。其中的值为props和ref,分别与之对父组件传递值时的接口

useImperativeHandle(ref,()=>{({})},[])的形式只是暴露我们所需要的方法或者参数,其他的就不用暴露给父组件,这样方便于我们操作

然后就完成了操作子组件的相关方法。

该总结只是作为我刚使用TS完成父子组件调用值。可能会有啥总结的不正确或者文章中有啥错误也可以指出讨论。共同进步

到此这篇关于React中使用TS完成父组件调用子组件的文章就介绍到这了,更多相关React父组件调用子组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • react使用.env文件管理全局变量的方法

    react使用.env文件管理全局变量的方法

    本文主要介绍了react使用.env文件管理全局变量的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • react Input组件Compositionstart和Compositionend事件

    react Input组件Compositionstart和Compositionend事件

    这篇文章主要为大家介绍了Compositionstart和Compositionend事件之于react组件库Input组件的坑解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • React解析html 标签的方法

    React解析html 标签的方法

    在React中,解析HTML标签通常是使用JSX(JavaScript XML)语法的一部分,这篇文章主要介绍了React 用来解析html 标签的方法,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • 解决React报错React Hook useEffect has a missing dependency

    解决React报错React Hook useEffect has a missing dependency

    这篇文章主要为大家介绍了解决React报错React Hook useEffect has a missing dependency,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • React+Electron快速创建并打包成桌面应用的实例代码

    React+Electron快速创建并打包成桌面应用的实例代码

    这篇文章主要介绍了React+Electron快速创建并打包成桌面应用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • React文字展开收起组件的实现示例

    React文字展开收起组件的实现示例

    本文主要介绍了React文字展开收起组件的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 深入理解React Native核心原理(React Native的桥接(Bridge)

    深入理解React Native核心原理(React Native的桥接(Bridge)

    这篇文章主要介绍了深入理解React Native核心原理(React Native的桥接(Bridge),本文重点给大家介绍React Native的基础知识及实现原理,需要的朋友可以参考下
    2021-04-04
  • 如何使用Redux Toolkit简化Redux

    如何使用Redux Toolkit简化Redux

    redux-toolkit是目前redux官方推荐的编写redux逻辑的方法,针对redux的创建store繁琐、样板代码太多、依赖外部库等问题进行了优化,官方总结了四个特点是简易的/有想法的/强劲的/高效的,总结来看,就是更加的方便简单了
    2022-12-12
  • 如何将你的AngularJS1.x应用迁移至React的方法

    如何将你的AngularJS1.x应用迁移至React的方法

    本篇文章主要介绍了如何将你的AngularJS1.x应用迁移至React的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • React找不到模块“./index.module.scss”或其相应的类型声明及解决方法

    React找不到模块“./index.module.scss”或其相应的类型声明及解决方法

    这篇文章主要介绍了React找不到模块“./index.module.scss”或其相应的类型声明及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09

最新评论