0

0

在react中有关组件通信有哪些方法?

亚连

亚连

发布时间:2018-06-21 17:20:42

|

2471人浏览过

|

来源于php中文网

原创

这篇文章主要给大家介绍了关于react中组件通信的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

前言

刚入门React可能会因为React的单向数据流的特性而遇到组件间沟通的麻烦,下面这篇文章就来给大家详细介绍下,在开始之前先来看一张图:

react组件通信

  • 需要组件之进行通信的几种情况

  • 父组件向子组件通信

  • 子组件向父组件通信

  • 跨级组件通信

  • 没有嵌套关系组件之间的通信

1. 父组件向子组件通信

React数据流动是单向的,父组件向子组件通信也是最常见的;父组件通过props向子组件传递需要的信息
Child.jsx

import React from 'react';
import PropTypes from 'prop-types';
export default function Child({ name }) {
 return 

Hello, {name}

; } Child.propTypes = { name: PropTypes.string.isRequired, };

Parent.jsx

import React, { Component } from 'react';
import Child from './Child';
class Parent extends Component {
 render() {
  return (
   

); } } export default Parent;

2. 子组件向父组件通信

  • 利用回调函数

  • 利用自定义事件机制

回调函数

实现在子组件中点击隐藏组件按钮可以将自身隐藏的功能

List3.jsx

import React, { Component } from 'react';
import PropTypes from 'prop-types';
class List3 extends Component {
 static propTypes = {
  hideConponent: PropTypes.func.isRequired,
 }
 render() {
  return (
   

哈哈,我是List3

); } } export default List3;

App,jsx

import React, { Component } from 'react';
import List3 from './components/List3';
export default class App extends Component {
 constructor(...args) {
  super(...args);
  this.state = {
   isShowList3: false,
  };
 }
 showConponent = () => {
  this.setState({
   isShowList3: true,
  });
 }
 hideConponent = () => {
  this.setState({
   isShowList3: false,
  });
 }
 render() {
  return (
   

{ this.state.isShowList3 ? : null }

); } }

观察一下实现方法,可以发现它与传统回调函数的实现方法一样.而且setState一般与回调函数均会成对出现,因为回调函数即是转换内部状态是的函数传统;

3. 跨级组件通信

层层组件传递props

例如A组件和B组件之间要进行通信,先找到A和B公共的父组件,A先向C组件通信,C组件通过props和B组件通信,此时C组件起的就是中间件的作用

使用context

context是一个全局变量,像是一个大容器,在任何地方都可以访问到,我们可以把要通信的信息放在context上,然后在其他组件中可以随意取到;

但是React官方不建议使用大量context,尽管他可以减少逐层传递,但是当组件结构复杂的时候,我们并不知道context是从哪里传过来的;而且context是一个全局变量,全局变量正是导致应用走向混乱的罪魁祸首.

使用context

下面例子中的组件关系: ListItem是List的子组件,List是app的子组件

ListItem.jsx

import React, { Component } from 'react';
import PropTypes from 'prop-types';
class ListItem extends Component {
 // 子组件声明自己要使用context
 static contextTypes = {
  color: PropTypes.string,
 }
 static propTypes = {
  value: PropTypes.string,
 }
 render() {
  const { value } = this.props;
  return (
   
  • {value}
  • ); } } export default ListItem;

    List.jsx

    行业贸易网站管理系统 2007 Beta 1
    行业贸易网站管理系统 2007 Beta 1

    1.修正BUG站用资源问题,优化程序2.增加关键词搜索3.修改报价4.修正BUG 水印问题5.修改上传方式6.彻底整合论坛,实现一站通7.彻底解决群发垃圾信息问题。注册会员等发垃圾邮件7.彻底解决数据库安全9.修改交易方式.增加网站担保,和直接交易两中10.全站可选生成html.和单独新闻生成html(需要装组建)11. 网站有10中颜色选择适合不同的行业不同的颜色12.修改竞价格排名方式13.修

    下载
    import ListItem from './ListItem';
    class List extends Component {
     // 父组件声明自己支持context
     static childContextTypes = {
      color: PropTypes.string,
     }
     static propTypes = {
      list: PropTypes.array,
     }
     // 提供一个函数,用来返回相应的context对象
     getChildContext() {
      return {
       color: 'red',
      };
     }
     render() {
      const { list } = this.props;
      return (
       

      { list.map((entry, index) => , ) }

    ); } } export default List;

    app.jsx

    import React, { Component } from 'react';
    import List from './components/List';
    const list = [
     {
      text: '题目一',
     },
     {
      text: '题目二',
     },
    ];
    export default class App extends Component {
     render() {
      return (
       

    ); } }

    4. 没有嵌套关系的组件通信

    使用自定义事件机制

    在componentDidMount事件中,如果组件挂载完成,再订阅事件;在组件卸载的时候,在componentWillUnmount事件中取消事件的订阅;

    以常用的发布/订阅模式举例,借用Node.js Events模块的浏览器版实现

    使用自定义事件的方式

    下面例子中的组件关系: List1和List2没有任何嵌套关系,App是他们的父组件;

    实现这样一个功能: 点击List2中的一个按钮,改变List1中的信息显示

    首先需要项目中安装events 包:

    npm install events --save

    在src下新建一个util目录里面建一个events.js

    import { EventEmitter } from 'events';
    export default new EventEmitter();

    list1.jsx

    import React, { Component } from 'react';
    import emitter from '../util/events';
    class List extends Component {
     constructor(props) {
      super(props);
      this.state = {
       message: 'List1',
      };
     }
     componentDidMount() {
      // 组件装载完成以后声明一个自定义事件
      this.eventEmitter = emitter.addListener('changeMessage', (message) => {
       this.setState({
        message,
       });
      });
     }
     componentWillUnmount() {
      emitter.removeListener(this.eventEmitter);
     }
     render() {
      return (
       

    {this.state.message}

    ); } } export default List;

    List2.jsx

    import React, { Component } from 'react';
    import emitter from '../util/events';
    class List2 extends Component {
     handleClick = (message) => {
      emitter.emit('changeMessage', message);
     };
     render() {
      return (
       

    ); } }

    APP.jsx

    import React, { Component } from 'react';
    import List1 from './components/List1';
    import List2 from './components/List2';
    export default class App extends Component {
     render() {
      return (
       

    ); } }

    自定义事件是典型的发布订阅模式,通过向事件对象上添加监听器和触发事件来实现组件之间的通信

    总结

    • 父组件向子组件通信: props

    • 子组件向父组件通信: 回调函数/自定义事件

    • 跨级组件通信: 层层组件传递props/context

    • 没有嵌套关系组件之间的通信: 自定义事件

    在进行组件通信的时候,主要看业务的具体需求,选择最合适的;

    当业务逻辑复杂到一定程度,就可以考虑引入Mobx,Redux等状态管理工具

    上面是我整理给大家的,希望今后会对大家有帮助。

    相关文章:

    详细解读javascript中map数据结构

    使用Javascript如何实现自定义事件机制

    使用vue如何实现登录注册及token验证

    使用vue如何实现token验证

    相关专题

    更多
    Golang gRPC 服务开发与Protobuf实战
    Golang gRPC 服务开发与Protobuf实战

    本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

    8

    2026.01.15

    公务员递补名单公布时间 公务员递补要求
    公务员递补名单公布时间 公务员递补要求

    公务员递补名单公布时间不固定,通常在面试前,由招录单位(如国家知识产权局、海关等)发布,依据是原入围考生放弃资格,会按笔试成绩从高到低递补,递补考生需按公告要求限时确认并提交材料,及时参加面试/体检等后续环节。要求核心是按招录单位公告及时响应、提交材料(确认书、资格复审材料)并准时参加面试。

    44

    2026.01.15

    公务员调剂条件 2026调剂公告时间
    公务员调剂条件 2026调剂公告时间

    (一)符合拟调剂职位所要求的资格条件。 (二)公共科目笔试成绩同时达到拟调剂职位和原报考职位的合格分数线,且考试类别相同。 拟调剂职位设置了专业科目笔试条件的,专业科目笔试成绩还须同时达到合格分数线,且考试类别相同。 (三)未进入原报考职位面试人员名单。

    58

    2026.01.15

    国考成绩查询入口 国考分数公布时间2026
    国考成绩查询入口 国考分数公布时间2026

    笔试成绩查询入口已开通,考生可登录国家公务员局中央机关及其直属机构2026年度考试录用公务员专题网站http://bm.scs.gov.cn/pp/gkweb/core/web/ui/business/examResult/written_result.html,查询笔试成绩和合格分数线,点击“笔试成绩查询”按钮,凭借身份证及准考证进行查询。

    11

    2026.01.15

    Java 桌面应用开发(JavaFX 实战)
    Java 桌面应用开发(JavaFX 实战)

    本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

    65

    2026.01.14

    php与html混编教程大全
    php与html混编教程大全

    本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

    36

    2026.01.13

    PHP 高性能
    PHP 高性能

    本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

    75

    2026.01.13

    MySQL数据库报错常见问题及解决方法大全
    MySQL数据库报错常见问题及解决方法大全

    本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

    21

    2026.01.13

    PHP 文件上传
    PHP 文件上传

    本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

    35

    2026.01.13

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    React 教程
    React 教程

    共58课时 | 3.7万人学习

    Bootstrap4.x---十天精品课堂
    Bootstrap4.x---十天精品课堂

    共22课时 | 1.6万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号