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

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

 

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

 

posted @ 2020-11-01 00:19  天高任鸟飞吧  阅读(3284)  评论(1编辑  收藏  举报