react类组件中父组件调用子组件函数

1、自定义事件

子组件在 componentDidMount 生命周期里调用父组件的方法将 this 传给父组件

Son

import React, { Component } from 'react'

export default class Son extends Component {

  state = {
    count: 0
  }
  
  // 在组件加载完成之后,自动执行一次,把this传递给父组件
  componentDidMount() {
   this.props.onChildEvent(this) 
  }

  // 子组件方法,父组件调用
  addCount = () => {
    this.setState({
      count: this.state.count + 1
    })
  }

  render() {
    console.log(111);
    return (
      <div>Son=={this.state.count}</div>
    )
  }

App

import React, { Component } from 'react'
import Son from './components/Son'

export default class App extends Component {

  parameter = (ref) => {
    // 将子组件的实例存到 this.childRef 中, 这样整个父组件就能拿到子组件的实例
    this.childRef = ref
  }

  countHandle = () => {
    // 调用子组件的方法
    console.log(this.childRef.addCount())
  }

  render() {
    return (
      <div>
        <Son onChildEvent={this.parameter} />
        <button onClick={() => this.countHandle()}>点击</button>
      </div>
    )
  }
}

2、React.createRef

Son

import React, { Component } from 'react'

export default class Son extends Component {

  // 初始化状态
  state = {
    count: 0
  }
  
  // 父组件调用子组件方法
  setCount = () => {
    this.setState({
      count: this.state.count + 1
    })
  }

  render() {
    return (
      <div>Son=={this.state.count}</div>
    )
  }
}

App

import React, { Component } from 'react'
import Son from './components/Son2'

export default class App extends Component {

  // 创建ref,并赋值给ChildRef
  ChildRef = React.createRef()

  // 点击按钮触发
  countHandle = () => {
    this.ChildRef.current.setCount()
  }

  render() {
    return (
      <div>
        <Son ref={this.ChildRef}/>
        <button onClick={this.countHandle}>点击</button>
      </div>
    )
  }
}

3、使用回调Refs

它能助你更精细地控制何时 refs 被设置和解除

不同于传递 createRef() 创建的 ref 属性,需要传递一个函数

Son

import React, { Component } from 'react'

export default class Son extends Component {

  // 初始化状态
  state = {
    count: 0
  }
  
  // 父组件调用子组件方法
  setCount = () => {
    this.setState({
      count: this.state.count + 1
    })
  }

  render() {
    return (
      <div>Son=={this.state.count}</div>
    )
  }
}

App

import React, { Component } from 'react'
import Son from './components/Son2'

export default class App extends Component {

  // 创建ref,并赋值给ChildRef
  ChildRef = null

  // 设置ref,并赋值给ChildRef
  setChildRef = (ref) => {
    this.ChildRef = ref
  }

  // 点击按钮触发
  countHandle = () => {
    this.ChildRef.setCount()
  }

  render() {
    return (
      <div>
        <Son ref={this.setChildRef}/>
        <button onClick={this.countHandle}>点击</button>
      </div>
    )
  }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React函数组件中,如果组件调用组件的方法,可以使用forwardRef和useImperativeHandle来实现。 1. 首先,在组件中使用forwardRef将组件包裹起来,并通过第二个参数ref接收组件传递的ref。 2. 然后,在组件中使用useImperativeHandle暴露组件的方法给组件使用。useImperativeHandle接受两个参数,第一个参数是定义current对象的ref,第二个参数是一个函数,返回值是一个对象,即这个ref的current对象,通过自定义组件的ref来使用组件ref的某些方法。 3. 在组件中,使用useRef创建一个ref,并将其传递给组件的ref属性。 4. 组件就可以通过ref.current来调用组件暴露的方法了。 代码示例: 组件: ```javascript import React, { useImperativeHandle, forwardRef } from 'react'; const ChildComponent = forwardRef((props, ref) => { function childMethod() { // 组件的方法逻辑 } useImperativeHandle(ref, () => ({ childMethod, })); return ( <div> {/* 组件的内容 */} </div> ); }); export default ChildComponent; ``` 组件: ```javascript import ChildComponent from './ChildComponent'; import { useRef } from 'react'; const ParentComponent = () => { const childRef = useRef(null); const handleClick = () => { childRef.current.childMethod(); }; return ( <> <button onClick={handleClick}>调用组件方法</button> <ChildComponent ref={childRef} /> </> ); }; export default ParentComponent; ``` 在上述代码中,组件通过childRef.current.childMethod()来调用组件方法childMethod()。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值