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

news2025/1/18 16:52:28

调用方法: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的方式

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32CubeIDE报“xxx is not implemented and will always fail”解决方法

本文介绍STM32CubeIDE报“xxx is not implemented and will always fail”解决方法。 最近用STM32CubeIDE开发STM32程序时&#xff0c;编译报警告&#xff1a; warning: _close is not implemented and will always fail warning: _lseek is not implemented and will always…

顺序表在线OJ题(详解+图解)

1&#xff1a;原地移除数组中所有的元素val&#xff08;时间复杂度为O(N)空间复杂度为O(1)&#xff09; 题目的大概意思是&#xff1a;用户自行输入一个数组&#xff0c;还要输入一个val的整形值&#xff0c;然后从数组中移除等于val的元素 我们根据题目的要求&#xff0c;时间…

软件测试/人工智能丨深入人工智能软件测试:PyTorch引领新时代

在人工智能的浪潮中&#xff0c;软件测试的角色变得愈发关键。本文将介绍在人工智能软件测试中的一些关键技术&#xff0c;以及如何借助PyTorch深度学习框架来推动测试的创新与升级。 PyTorch&#xff1a;深度学习的引擎 PyTorch作为一种开源的深度学习框架&#xff0c;为软件…

成功解决 IDEA 2020 版本 代码报错不提示的几种方案

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 前言 今天中午写代码的时候&#xff0c;ID…

项目文章:oxBS揭示复发性膀胱癌的DNA甲基化和羟甲基化变化并鉴定预测PD-L1表达标记物

近日&#xff0c;徐州市中心医院&#xff08;徐州医科大学徐州临床学院&#xff09;史振铎等为第一作者、韩从辉教授为通讯作者在《Biomarker Research》杂志发表题为“Integrative multi-Omics analysis depicts the methylome and hydroxymethylome of recurrent bladder can…

uni-app开发微信小程序 vue3写法添加pinia

说明 使用uni-app开发&#xff0c;选择vue3语法&#xff0c;开发工具是HBliuderX。虽然内置有vuex&#xff0c;但是个人还是喜欢用Pinia&#xff0c;所以就添加进去了。 Pinia官网连接 添加步骤 第一步&#xff1a; 在项目根目录下执行命令&#xff1a; npm install pinia …

外贸开发信主题怎么写?营销邮件标题推荐?

外贸开发信主题编写方法&#xff1f;如何用QQ邮件群发外贸邮件&#xff1f; 在外贸领域&#xff0c;写一封引人注目的开发信至关重要。外贸开发信主题应当吸引受众&#xff0c;引起兴趣&#xff0c;激发他们与您进一步合作的愿望。为了达到这个目标&#xff0c;蜂邮将探讨一些…

转行学习Java编程能学会吗?那些转行的人后来都怎么样了?

转行学习Java编程能学会吗?那些转行的人后来都怎么样了? 现在转行java编程的人群&#xff0c;就像考公考研的大军-样&#xff0c;看起来表面上是一个庞大的群体,但实际上 就跟考公考研的群体-样&#xff0c;其中有1/3的属于无准备&#xff0c;裸考就是陪跑的炮灰&#xff0c…

【已解决】启动SSH服务报“could not load host key”错误

文章目录 问题复现解决方案 问题复现 解决方案 yum remove openssh-* && yum install -y openssl openssh-server && systemctl restart sshd

【开源】基于JAVA的大学兼职教师管理系统

项目编号&#xff1a; S 004 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S004&#xff0c;文末获取源码。} 项目编号&#xff1a;S004&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 学生教师管…

智慧汽车—城市NOA迎爆发

在特斯拉引领的 TransformerBev 架构驱动下&#xff0c;智驾算法趋近于端到端的智驾大模型&#xff0c;使得智能驾驶开始步入城市 NOA 新时代。 消费者认知增强&#xff0c;未来市场空间广阔。伴随城市 NOA 在 23-24 年的落地和普及、L3 法规在年内的落地&#xff0c;行业 0-1…

软件测试面试思路技巧和方法分享,学到就是赚到

面试技巧(不包含笔试部分)&#xff1a; 一、面试前&#xff1a; 投递简历的第一建议是海投&#xff0c;经验不足的情况下切记&#xff0c;不要挑三拣四。 个人建议面试的安排周期&#xff0c;一天最多两家&#xff0c;如果不着急&#xff0c;就安排一家。当面试安排时间发生冲突…

Nas搭建webdav服务器并同步Zotero科研文献

无需云盘&#xff0c;不限流量实现Zotero跨平台同步&#xff1a;内网穿透私有WebDAV服务器 文章目录 无需云盘&#xff0c;不限流量实现Zotero跨平台同步&#xff1a;内网穿透私有WebDAV服务器一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zote…

VirtualKD-Redux 双机调试内驱驱动

官网使用说明 官网下载地址 简单的说 1. 如果是64位虚拟机&#xff0c;把target64文件夹拷贝到虚拟机中&#xff0c;然后安装vminstall.exe 2. 我电脑是用windbg prview, 在主机上打开 vmmon64.exe 3 设置DbgX.Shell.exe路径 D:\安装\WinDbg Preview1.1910.3003.0\Microsoft…

人格障碍在线测试,人格障碍筛查和判断 PDQ-4+

每个人都是独一无二的&#xff0c;每个人都存在人格上的偏差&#xff0c;日常生活中我们携带着自己的人格在忙碌&#xff0c;在不够成对学习、生活和工作的影响下&#xff0c;我们认为都是健康的人格&#xff0c;反之则属于人格障碍。 人格障碍给我们的日常生活带来极大的影响…

21. 深度学习 - 拓朴排序的原理和实现

文章目录 Hi,你好。我是茶桁。 上节课&#xff0c;我们讲了多层神经网络的原理&#xff0c;并且明白了&#xff0c;数据量是层级无法超过3层的主要原因。 然后我们用一张图来解释了整个链式求导的过程&#xff1a; 那么&#xff0c;我们如何将这张图里的节点关系来获得它的求…

2023最新版JavaSE教程——第8天:面向对象编程(高级)

目录 一、关键字&#xff1a;static1.1 类属性、类方法的设计思想1.2 static关键字1.3 静态变量1.3.1 语法格式1.3.2 静态变量的特点1.3.3 举例1.3.4 内存解析 1.4 静态方法1.4.1 语法格式1.4.2 静态方法的特点1.4.3 举例 1.5 练习 二、单例(Singleton)设计模式2.1 设计模式概述…

多GPU训练大型模型:资源分配与优化技巧 | 英伟达将推出面向中国的改良芯片HGX H20、L20 PCIe、L2 PCIe

★大模型、人工智能&#xff1b;数据并行&#xff1b;模型并行&#xff1b;流水线并行&#xff1b;混合精度训练、梯度累积&#xff1b;模型卸载CPU&#xff1b;重算&#xff1b;模型压缩&#xff1b;内存优化版优化器&#xff1b;Nvidia&#xff1b;A100;H100&#xff1b;A800…

法大大受邀参加高交会,为国产信创发展助力

近日&#xff0c;法大大受邀参与第二十五届中国国际高新技术成果交易会&#xff08;以下简称“高交会”&#xff09;中主题为“信创助力数字化转型新动能”的信息技术应用创新展暨高峰论坛。 高交会由商务部、科技部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权…

配置 ssh 免密登录

背景 从机器 A 使用 ssh 免密登录到机器 B&#xff0c;两台机器的 OS 都是 CentOS。其中机器 B 用作了一台 nodejs 的服务器&#xff0c;已经安装并运行了 sshd 服务&#xff0c;其用户名是 jmmem 我们想要实现在机器 A 上键入 ssh nodejs 就能免密登录到机器 B 的效果 机器…