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
到此,基本总结完毕,如果有什么不对的,还望大神指正...............
以上是 react+typescript 父组件主动获取子组件内暴露的方法或属性 的全部内容, 来源链接: utcz.com/z/384184.html