React父组件怎么调用子组件的方法

调用方法:1、类组件中的调用可以利用React.createRef()、ref的函数式声明或props自定义onRef属性来实现;2、函数组件、Hook组件中的调用可以利用useImperativeHandle或forwardRef抛出子组件ref来实现。

React父组件怎么调用子组件的方法

【程序员必备开发工具推荐】Apifox一款免费API管理工具Apifox = Postman + Swagger + Mock + JMeter

本教程操作环境:Windows7系统、react18版、Dell G3电脑。

在React中,我们经常在子组件中调用父组件的方法,一般用props回调即可。但是有时候也需要在父组件中调用子组件的方法,通过这种方法实现高内聚。有多种方法,请按需服用。

类组件中


1、React.createRef()
  • 优点:通俗易懂,用ref指向。

  • 缺点:使用了HOC的子组件不可用,无法指向真是子组件

    比如一些常用的写法,mobx的@observer包裹的子组件就不适用此方法。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

import React, { Component } from 'react';

class Sub extends Component {

  callback() {

    console.log('执行回调');

  }

  render() {

    return <div>子组件</div>;

  }

}

class Super extends Component {

  constructor(props) {

    super(props);

    this.sub = React.createRef();

  }

  handleOnClick() {

    this.sub.callback();

  }

  render() {

    return (

      <div>

        <Sub ref={this.sub}></Sub>

      </div>

    );

  }

}

2、ref的函数式声明
  • 优点:ref写法简洁
  • 缺点:使用了HOC的子组件不可用,无法指向真是子组件(同上)

使用方法和上述的一样,就是定义ref的方式不同。

1

2

3

4

5

...

<Sub ref={ref => this.sub = ref}></Sub>

...

3、使用props自定义onRef属性
  • 优点:假如子组件是嵌套了HOC,也可以指向真实子组件。
  • 缺点:需要自定义props属性

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

import React, { Component } from 'react';

import { observer } from 'mobx-react'

@observer

class Sub extends Component {

    componentDidMount(){

    // 将子组件指向父组件的变量

        this.props.onRef && this.props.onRef(this);

    }

    callback(){

        console.log("执行我")

    }

    render(){

        return (<div>子组件</div>);

    }

}

class Super extends Component {

    handleOnClick(){

       // 可以调用子组件方法

        this.Sub.callback();

    }

    render(){

        return (

          <div>

            <div onClick={this.handleOnClick}>click</div>

            <Sub onRef={ node => this.Sub = node }></Sub>   

          </div>)

    }

}

函数组件、Hook组件


1、useImperativeHandle
  • 优点: 1、写法简单易懂 2、假如子组件嵌套了HOC,也可以指向真实子组件
  • 缺点: 1、需要自定义props属性 2、需要自定义暴露的方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

import React, { useImperativeHandle } from 'react';

import { observer } from 'mobx-react'

const Parent = () => {

  let ChildRef = React.createRef();

  function handleOnClick() {

    ChildRef.current.func();

  }

  return (

    <div>

      <button onClick={handleOnClick}>click</button>

      <Child onRef={ChildRef} />

    </div>

  );

};

const Child = observer(props => {

  //用useImperativeHandle暴露一些外部ref能访问的属性

  useImperativeHandle(props.onRef, () => {

    // 需要将暴露的接口返回出去

    return {

      func: func,

    };

  });

  function func() {

    console.log('执行我');

  }

  return <div>子组件</div>;

});

export default Parent;

2、forwardRef

使用forwardRef抛出子组件的ref

这个方法其实更适合自定义HOC。但问题是,withRouter、connect、Form.create等方法并不能抛出ref,假如Child本身就需要嵌套这些方法,那基本就不能混着用了。forwardRef本身也是用来抛出子元素,如input等原生元素的ref的,并不适合做组件ref抛出,因为组件的使用场景太复杂了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

import React, { useRef, useImperativeHandle } from 'react';

import ReactDOM from 'react-dom';

import { observer } from 'mobx-react'

const FancyInput = React.forwardRef((props, ref) => {

  const inputRef = useRef();

  useImperativeHandle(ref, () => ({

    focus: () => {

      inputRef.current.focus();

    }

  }));

  return <input ref={inputRef} type="text" />

});

const Sub = observer(FancyInput)

const App = props => {

  const fancyInputRef = useRef();

  return (

    <div>

      <FancyInput ref={fancyInputRef} />

      <button

        onClick={() => fancyInputRef.current.focus()}

      >父组件调用子组件的 focus</button>

    </div>

  )

}

export default App;

总结

父组件调子组件函数有两种情况

  • 子组件无HOC嵌套:推荐使用ref直接调用
  • 有HOC嵌套:推荐使用自定义props的方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/152080.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nginx关闭重启和配置检查

优雅关闭Nginx 找出nginx的进程号&#xff1a;ps -ef | grep nginx 执行命令&#xff1a;kill -QUIT 主pid 注意&#xff1a; 其中pid是主进程号的pid&#xff08;master process&#xff09;&#xff0c;其他为子进程pid&#xff08;worker process&#xff09; 这种关闭方式…

计算机视觉基础(9)——相机标定与对极几何

前言 本节我们将学习相机标定和对极几何两部分的内容。 在相机标定部分&#xff0c;我们将学习直接线性变换&#xff08;Direct Linear Transform, DL&#xff09;,张正友标定法&#xff08;Zhang’s Method&#xff09;和 Perspective-n-Point (PnP) 这三种方法。 在对极几何部…

赢麻了……腾讯1面核心9问,小伙伴过了提42W offer

说在前面 在40岁老架构师尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常有小伙伴&#xff0c;需要面试腾讯、美团、京东、阿里、 百度、头条等大厂。 下面是一个小伙伴成功拿到通过了腾讯面试&#xff0c;并且最终拿到offer&#xff0c;一毕业就年薪42W&#x…

rabbit的扇出模式(fanout发布订阅)的生产者与消费者使用案例

扇出模式 fanout 发布订阅模式 生产者 生产者发送消息到交换机&#xff08;logs&#xff09;,控制台输入消息作为生产者的消息发送 package com.esint.rabbitmq.work03;import com.esint.rabbitmq.RabbitMQUtils; import com.rabbitmq.client.Channel;import java.util.Scanne…

csapp第三章读书笔记

caspp chapter 3 寄存器 operand form data movement instructions mov 指令例子: 0扩展 movz 指令: Zero-extending data movement instructions是一种计算机指令类型&#xff0c;涉及将数据从一个位置移动到另一个位置&#xff0c;同时通过在最重要的一端添加零位来将数据扩…

精美可视化:Python自动化生成漂亮的测试报告

“ 运用Python的Unittest、数据驱动测试&#xff08;DDT&#xff09;、Excel、Jinja2和HTML技术&#xff0c;构建一个能够自动生成精美可视化测试报告的自动化测试框架” 思路流程 封装读取数据&#xff0c;让所有数据都能够再excel中填写&#xff0c;不再填写任何一行逻辑代码…

【前端】使用json-server报错

当我们使用json-server模仿后端接口时需要运行json-server --watch index.json这个命令生成增删改查接口但是可能会报这个错误&#xff0c;如图 这时我们运行 npm i json-server -g命令即可&#xff0c;然后再重新运行json-server --watch index.json就行了

编码器脉冲信号测量2路DI高速计数器PNP/NPN转RS-485数据采集模块 解码转换成标准Modbus RTU协议 YL150-485

特点&#xff1a; ● 编码器解码转换成标准Modbus RTU协议 ● 可用作编码器计数器或者转速测量 ● 支持编码器计数&#xff0c;可识别正反转 ● 也可以设置作为2路独立DI高速计数器 ● 计数值支持断电自动保存 ● DI输入支持PNP和NPN输入 ● 继电器和机械开关输入时可以…

C++入门(2)—函数重载、引用

目录 一、函数重载 1、参数类型不同 2、参数个数不同 3、参数顺序不同 4、 链接中如何区分函数重载 二、引用 1、规则 2、特征 3、使用场景 做参数 做返回值 4、常引用 5、传值、传引用效率比较 6、引用和指针的区别 接上一小节C入门(1)—命名空间、缺省参数 一…

解决requests库中的期限处理问题:从404到异常再到修复

在使用requests库进行网络请求时&#xff0c;用户可能会遇到一个奇怪的问题&#xff1a;当没有指定请求的期限时&#xff0c;他们得到的响应是404错误&#xff0c;但是一旦指定了请求的期限&#xff0c;就立刻遇到了一个异常&#xff0c;声称远程主机强制关闭了连接。这个问题让…

pytorch文本分类(一):文本预处理

pytorch文本分类&#xff08;一&#xff09;&#xff1a;文本预处理 本文为自己在鲸训练营答题总结&#xff0c;作业练习都在和鲸社区数据分析协作平台 ModelWhale 上。 &#x1f6a9;学习任务原链接在这里 相关数据链接&#xff1a;https://pan.baidu.com/s/1iwE3LdRv3uAkGGI…

Spring Boot使用EhCache完成一个缓存集群

在上一篇在SpringBoot中使用EhCache缓存&#xff0c;我们完成了在Spring Boot中完成了对EhCaChe的使用&#xff0c;这篇&#xff0c;我们将对EhCache的进一步了解&#xff0c;也就是搭建一个EhCache的缓存集群。 集群 在搭建一个EhCache的时候&#xff0c;我们需要先了解&…

【linux】nmon 工具使用

nmon 介绍 nmon是奈杰尔的性能监视器的缩写&#xff0c;适用于POWER、x86、x86_64、Mainframe和现在的ARM&#xff08;Raspberry Pi&#xff09;上的Linux。同样适用于nmon for AIX的工具&#xff08;与IBM的AIX一起提供&#xff09;。njmon与之类似&#xff0c;但将数据保存为…

分类预测 | Matlab实现PSO-GRU-Attention粒子群算法优化门控循环单元融合注意力机制多特征分类预测

分类预测 | Matlab实现PSO-GRU-Attention粒子群算法优化门控循环单元融合注意力机制多特征分类预测 目录 分类预测 | Matlab实现PSO-GRU-Attention粒子群算法优化门控循环单元融合注意力机制多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现PSO…

前端转行可以做什么

前端开发者通常拥有很好的技术背景和解决问题的能力&#xff0c;所以有很多可能的职业选择。以下是一些可能的选择&#xff1a; 全栈开发&#xff1a;这是一个非常热门的职位&#xff0c;需要能够处理前端和后端工作。使用多种编程语言和技术来构建从数据库到用户界面的整个应…

Android14 Beta 5

Beta 5&#xff0c;这是 Android 14 Beta 计划中的最后一次计划更新。这是确保您的应用程序已准备就绪并在非 Beta 用户开始获取 Android 14 之前提供反馈的最后机会。为了使您能够在跨多种外形尺寸的设备上测试您的应用程序&#xff0c;Beta 5 适用于 Pixel Tablet 和 Pixel F…

智能制造中后期:深挖成本、提升效率的关键——标准工时

在智能制造的背景下&#xff0c;企业面临着持续的成本压力和效率提升的需求。特别是在智能制造的中后期&#xff0c;要想进一步深挖成本、提升效率&#xff0c;必须考虑标准工时这一重要因素。标准工时作为一种基础而富有价值的管理工具&#xff0c;对于建立领先的标准工时系统…

使用tesseract-ocr实现图片中的中英文字符提取

1 tesseract-ocr介绍 OCR(Optical Character Recognition)&#xff1a;光学字符识别,是指对图片文件中的文字进行分析识别&#xff0c;获取的过程。 Tesseract&#xff1a;开源的OCR识别引擎&#xff0c;初期Tesseract引擎由HP实验室研发&#xff0c;后来贡献给了开源软件业&…

【2023云栖】刘一鸣:Data+AI时代大数据平台建设的思考与发布

简介&#xff1a; 本文根据2023云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;刘一鸣 | 阿里云自研大数据产品负责人 演讲主题&#xff1a;DataAI时代大数据平台应该如何建设 今天分享的主题是DataAI时代大数据平台应该如何建设&#xf…

本地mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止

背景介绍&#xff1a; MySQL版本5.7&#xff0c;系统Win7&#xff0c;启动mysql服务时提示如下 解决方案 【会删除库中数据及mysql注册信息】&#xff1a; 1、删除原服务MySQL57 C:\Program Files\MySQL\MySQL Server 5.7\bin>mysqld --remove MySQL572、清空data 清空…