react+typescript 父组件主动获取子组件内暴露的方法或属性

react

react一般 父子组件通讯都通过props, 如果向父组传值,也是由父组件通过props传一个方法到子组件来传值调用

本文主要是总结一下父组件(主动)获取子组件内暴露的方法或属性,react 组件 一般主要分class 类组件和函数组件,

总结分分为三种情况

(1). class 父组件获取  class 子组件内部暴露的属性和方法 

(2).  class 父组件获取 函数(hook)子组件内部暴露的属性和方法 

(3.)  函数(hook) 父组件获取  函数(hook)子组件内部暴露的属性和方法 

1.  第一种:class 父组件获取  class 子组件

// ClassChild.tsx  类子组件

import React, { Component } from "react"

export default class ClassChild extends Component{

state = {

index : 0

}

// 这个方法 可以被父组件获取到

childGet=()=>{

return "this is classComponent methonds and data"+this.state.index

}

render(){

return <div> ClassChild <button type="button">ClassChildGet</button></div>

}

}

//ClassParent.tsx  类父组件

import React, { Component} from "react"

import ClassChild from "./classChild"

export default class ClassParent extends Component{

classChildRef:ClassChild|null=null //初始化ref

// 获取 class 类子组件 暴露的方法/属性

getClassChildFn(){

// (this.classChildRef as ClassChild).childGet()

console.log("ClassParentGet--ClassChild",this.classChildRef?.childGet())

}

render(){

return <div>

<p>class 父组件获取 class类子组件 的内部值</p>

<button type="button" onClick={()=>this.getClassChildFn()}>ClassParentGet--ClassChild</button>

<ClassChild ref={(ref)=>{this.classChildRef = ref}}></ClassChild>

</div>

}

}

2.  第一种:class 父组件获取  函数(hook)子组件

  函数组件用到了  forwardRef()  和  useImperativeHandle()

//HooksChild.tsx 函数组件

import React,{forwardRef,useImperativeHandle, useRef, useState} from "react"

interface Iprops {}

const HooksChild = (props:Iprops,ref: any)=>{

const divRef = useRef<HTMLDivElement>(null);

const [index,setIndex] = useState(0)

useImperativeHandle(ref,()=>{

// 这里return 的对象里面方法和属性可以被父组件调用

return {

toGet(){

return index

},

divRef

}

})

const childGet = ()=>{

console.log("HooksChildGet",setIndex(index+1))

}

return <div ref={divRef}>HooksChild <button type="button" onClick={childGet}>HooksChildGet</button></div>

}

export default forwardRef(HooksChild)

//ClassParent.tsx 类父组件 

import React, { Component, createRef } from "react"

import HooksChild from "./hooksChild"

// 示例: class 父组件获取 hooks 子组件内部暴露的属性和方法 Ref

interface IChildRef {

toGet:()=>any
divRef:HTMLDivElement

}

export default class ClassParent extends Component{

hooksChildRef = createRef<IChildRef>() //初始化ref

// 获取 hooks 子组件 暴露的方法/属性

getHooksChildFn(){

// console.log("ClassParentGet--HooksChild",(this.hooksChildRef.current as IChildRed).toGet())

console.log("ClassParentGet--HooksChild",this.hooksChildRef.current?.toGet())

}

render(){

return <div>

<p>class 父组件获取 子组件hooks 的内部值</p>

<button type="button" onClick={()=>this.getHooksChildFn()}>ClassParentGet--HooksChild</button>

<HooksChild ref={this.hooksChildRef}></HooksChild>

</div>

}

}

3. 第三种 : 函数(hook) 父组件获取  函数(hook)子组件

//HooksParent.tsx  函数父组件 

import React, { useRef } from "react"

import HooksChild from "./hooksChild"

export interface IChildRef {

toGet:()=>any,

divRef:HTMLDivElement

}

// 示例: hooks 父组件获取 hooks 子组件内部暴露的属性和方法 Ref

const HooksParent = ()=>{

const childRef = useRef<IChildRef>()

const getdataFn=()=>{

console.log(childRef)

console.log("HooksParent--HooksChild",childRef.current?.toGet())

}

return <div>

<p> hooks父组件获取 子组件hooks 的内部值</p>

<button type="button" onClick={getdataFn}>HooksParent{`=>`}hooksChild :</button>

<HooksChild ref={childRef}/>

</div>

}

export default HooksParent

到此,基本总结完毕,如果有什么不对的,还望大神指正...............

以上是 react+typescript 父组件主动获取子组件内暴露的方法或属性 的全部内容, 来源链接: utcz.com/z/384184.html

回到顶部