首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >react组件间的通信

react组件间的通信

作者头像
OECOM
发布于 2020-07-02 01:28:50
发布于 2020-07-02 01:28:50
79500
代码可运行
举报
文章被收录于专栏:OECOMOECOM
运行总次数:0
代码可运行

在使用react过程中,不可避免的需要组件间的数据通信,数据通信一般情况有一下几种情况:

  1. 父组件向子组件通信
  2. 子组件向父组件通信
  3. 跨级组件之间通信
  4. 非嵌套组件间通信

下面将依次来说一下这几种组件间通信的解决办法。

父组件向子组件通信

这种通信方式是最常见的一种,解决方法就是通过props来进行通信,子组件接收到props后再进行相应的处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React,{Component} from 'react';
import Header from './header'
import './father.less';

class Father extends Component{
  constructor(){
    super();
    this.state={
      myName:"张三"
    }
  }
  render(){
    return (
      <div className="container">
        <Header title={this.state.myName}/>
      </div>
    )
  }
}
export default Father

上面代码为father组件,在其内部引入了header子组件,并将自己的state中的myName传递给header组件,定义名称为title,在子组件中可以通过this.props.title来获取到值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React,{Component} from 'react';
import './header.less';

class Header extends Component{
  render(){
    return (
      <div className="components-header row">
        {this.props.myName}
      </div>
    )
  }
}
export default Header

上述代码就是一个简单的父组件向子组件来传递数据。当然,为了保证程序的严谨性,在子组件中我们可以对传递过来的props进行类型校验,如果类型校验没有通过,则会抛出一个错误,已提醒调用组件者。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React,{Component} from 'react';
import './header.less';

class Header extends Component{
  propsType:{
    title:React.propsTypes.String
  }
  render(){
    return (
      <div className="components-header row">
        {this.props.myName}
      </div>
    )
  }
}
export default Header

如此即完成了对于传递过来的参数校验。

子组件向父组件通信

子组件向父组件通信可以通过回调函数的方式来进行,我们还是将上面的代码来修改一下。

先看father组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React,{Component} from 'react';
import Header from './header'

class Father extends Component{
  constructor(){
    super();
    this.state={
      myName:"张三"
    }
  }
  showChildName(name){
    console.log(name);
  }
  render(){
    return (
      <div className="container">
        <Header showName={this.showChildName.bind(this)}/>
      </div>
    )
  }
}
export default Father

其次是子组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React,{Component} from 'react';
import './header.less';

class Header extends Component{
  propsType:{
    showName:React.propsTypes.Func
  }
  constructor(){
    super();
    this.state={
      myName:"header"
    }
  }
  showName(){
    let myName = this.state.myName;
    this.props.showName(myName)
  }
  render(){
    return (
      <div className="components-header row">
        <button onClick={this.showName.bind(this)}>按钮</button>
      </div>
    )
  }
}
export default Header

跨组件通信

所谓跨级组件通信,就是父组件向子组件的子组件通信,向更深层的子组件通信。跨级组件通信可以采用下面两种方式:中间组件层层传递props;使用context对象

对于第一种方式,如果父组件结构较深,那么中间的每一层组件都要去传递 props,增加了复杂度,并且这些 props 并不是这些中间组件自己所需要的。不过这种方式也是可行的,当组件层次在三层以内可以采用这种方式,当组件嵌套过深时,采用这种方式就需要斟酌了。 使用 context 是另一种可行的方式,context 相当于一个全局变量,是一个大容器,我们可以把要通信的内容放在这个容器中,这样一来,不管嵌套有多深,都可以随意取用。 使用 context 也很简单,需要满足两个条件:

  1. 上级组件要声明自己支持 context,并提供一个函数来返回相应的 context 对象
  2. 子组件要声明自己需要使用 context

下面请看一个例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { Component } from 'react';
import Sub from "./Sub";
import "./App.css";

export default class App extends Component{
    // 父组件声明自己支持 context
    static childContextTypes = {
        color:React.propTypes.string,
        callback:React.propTypes.func,
    }
    // 父组件提供一个函数,用来返回相应的 context 对象
    getChildContext(){
        return{
            color:"red",
            callback:this.callback.bind(this)
        }
    }
    callback(msg){
        console.log(msg)
    }
    render(){
        return(
            <div>
                <Sub></Sub>
            </div>
        );
    }
}

sub组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from "react";
import SubSub from "./SubSub";

const Sub = (props) =>{
    return(
        <div>
            <SubSub />
        </div>
    );
}

export default Sub;

subsub组件(孙子组件)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React,{ Component } from "react";
import PropTypes from "prop-types";

export default class SubSub extends Component{
    // 子组件声明自己需要使用 context
    static contextTypes = {
        color:PropTypes.string,
        callback:PropTypes.func,
    }
    render(){
        const style = { color:this.context.color }
        const cb = (msg) => {
            return () => {
                this.context.callback(msg);
            }
        }
        return(
            <div style = { style }>
                SUBSUB
                <button onClick = { cb("孙子组件信息") }>按钮</button>
            </div>
        );
    }
}

跨组件通信

跨组件通信的方式适用于以上所有的通信方式,这种方式是通过发布/订阅者模式来实现,需要安装PubSub

首先是通过npm来安装pubsub

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install pubsub-js --save

页面中引入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import PubSub from 'pubsub-js'

pubsub有三中操作,分别是发布消息,订阅消息,取消订阅

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
发送消息:PubSub.publish(名称,参数)
订阅消息:PubSub.subscrib(名称,函数)
取消订阅:PubSub.unsubscrib(名称)

首先发送消息需要顶一个名称,以供给订阅消息的名称来确定订阅哪个消息,基本上是一个键值对的形式,参数是该键的值,当在组件中注册了订阅消息以后,相当与注册了一个监听事件,当有发布消息发出,订阅消息就会接收到,并在订阅消息的函数中进行自定义处理。取消订阅相当于是取消该监听事件。

home组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { Component } from 'react';  
import PubSub from 'pubsub-js';  
class Home extends Component {  
  constructor(props){  
    super(props);  
    this.state={  
      increase:'increase',  
      decrease:'decrease'  
    }  
  }  
  buttonIncrease(){  
    PubSub.publish('PubSubmessag',this.state.increase);  
  }  
  buttonDecrease(){  
     PubSub.publish('PubSubmessage', this.state.decrease);  
  }  
  render() {  
    return (  
      <div>  
        Some state changes:  
        <button onClick={this.buttonIncrease.bind(this)}>Increase</button>  
        <button onClick={this.buttonDecrease.bind(this)}>Decrease</button>  
      </div>  
    )  
  }  
}  
export default Home;

子组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { Component } from 'react';  
import { Link} from 'react-router-dom';  
import PubSub from 'pubsub-js';  
  
export default class App extends Component{  
constructor(props){  
  super(props);  
  this.state={  
    increase:'none',  
  }  
}  
componentDidMount(){  
  this.pubsub_token = PubSub.subscribe('PubSubmessage', function (topic,message) {  
    this.setState({  
      increase: message  
    });  
  }.bind(this));  
}  
componentWillUnmount(){  
  PubSub.unsubscribe(this.pubsub_token);  
}  
  render() {  
  return (  
    <div>  
      <header>  
        Links:       
        <Link to="/App/home">Home</Link>     
      </header>   
      <div style={{ marginTop: '1.5em' }}>{ this.props.children}</div>  
      <div style={{ marginTop: '1.5em' }}>{ this.state.increase}</div>  
    </div>  
  )  
}  
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【React】归纳篇(九)组件间通信的3中方式之props与订阅发布机制 | subscribe | publish | 改写前面练习
前端修罗场
2023/10/07
3600
react 创建组件以及组件通信
关于React.createClass方法与class App extends Component方法的区别
念念不忘
2019/03/29
1.1K0
React框架 组件之间通讯
郭顺发
2023/07/17
1610
React中组件间通信的方式
props适用于父子组件的通信,props以单向数据流的形式可以很好的完成父子组件的通信,所谓单向数据流,就是数据只能通过props由父组件流向子组件,而子组件并不能通过修改props传过来的数据修改父组件的相应状态,所有的props都使得其父子props之间形成了一个单向下行绑定,父级props的更新会向下流动到子组件中,但是反过来则不行,这样会防止从子组件意外改变父级组件的状态,导致难以理解数据的流向而提高了项目维护难度。实际上如果传入一个基本数据类型给子组件,在子组件中修改这个值的话React中会抛出异常,如果对于子组件传入一个引用类型的对象的话,在子组件中修改是不会出现任何提示的,但这两种情况都属于改变了父子组件的单向数据流,是不符合可维护的设计方式的。 我们通常会有需要更改父组件值的需求,对此我们可以在父组件自定义一个处理接受变化状态的逻辑,然后在子组件中如若相关的状态改变时,就触发父组件的逻辑处理事件,在React中props是能够接受任意的入参,此时我们通过props传递一个函数在子组件触发并且传递值到父组件的实例去修改父组件的state。
WindRunnerMax
2021/02/04
2.8K0
React中组件通信的几种方式
React数据流动是单向的,父组件向子组件通信也是最常见的;父组件通过props向子组件传递需要的信息 Child.jsx
木子星兮
2020/07/16
2.6K0
React学习笔记(四)—— 组件通信与状态管理、Hooks、Redux、Mobe
2、利用Redux进行状态管理,这种方式的配套工具比较齐全,可以自定义各种中间件;
张果
2023/03/24
5.5K0
React学习笔记(四)—— 组件通信与状态管理、Hooks、Redux、Mobe
React -- 组件间通信
分为三种类型的通信关系: 1、父组件向子组件通信 2、子组件向父组件通信 3、没有嵌套关系的组件之间的通信 父组件向子组件通信 父组件通过子组件的props向子组件传递需要的信息。 子组件向父组件通信 两种方法: 1、利用回调函数 2、利用自定义事件机制 一个栗子: ListItem类: class ListItem extends Component { static defaultProps = { text: '', checked: false,
前朝楚水
2018/04/03
1.1K0
解密传统组件间通信与React组件间通信
在React中最小的逻辑单元是组件,组件之间如果有耦合关系就会进行通信,本文将会介绍React中的组件通信的不同方式
前端迷
2019/12/05
1.6K0
组件设计基础(2)
早期的react设计了许多的生命周期钩子。它们严格定义了组件的生命周期,一般说,生命周期可能会经历如下三个过程:
一粒小麦
2019/12/04
6750
React组件之间的通信方式总结(下)
但是 React 和 Vue 相同都是数据驱动的,但是这个时候和数据驱动没啥关系,每隔1秒钟重新创建一个 ele,然后再渲染到页面中,视图才发生变化;为了使用数据驱动,我们需要使用 React 的组件
beifeng1996
2022/10/06
1.9K0
React组件通信
react因为组件化,使得组件间通信十分的重要。本文就来简单介绍一些常见的react组件间传递的内容。
xiaofeng123aa
2022/10/18
1.3K0
react基础--1
2.发现组件是函数定义的,随后调用该函数,将返回的虚拟DOM转换为真实DOM,随后展示在页面中
切图仔
2022/09/08
9190
react入门(六):状态提升&context上下文小白速懂
使用 react 经常会遇到几个组件需要共用状态数据的情况。这种情况下,我们最好将这部分共享的状态提升至他们最近的父组件当中进行管理。
柴小智
2020/02/13
1.5K0
React组件详解
众所周知,组件作为React的核心内容,是View的重要组成部分,每一个View页面都由一个或多个组件构成,可以说组件是React应用程序的基石。在React的组件构成中,按照状态来分可以分为有状态组件和无状态组件。 所谓无状态组件,就是没有状态控制的组件,只做纯静态展示的作用,无状态组件是最基本的组件形式,它由属性props和渲染函数render构成。由于不涉及到状态的更新,所以这种组件的复用性也最强。 有状态组件是在无状态组件的基础上增加了组件内部状态管理,有状态组件通常会带有生命周期lifecycle,用以在不同的时刻触发状态的更新,有状态组件被大量用在业务逻辑开发中。
xiangzhihong
2022/11/30
1.9K0
前端面试之React
React就是Facebook的一个开源JS框架,专注的层面为View层,不包括数据访问层或者那种Hash路由(不过React 有插件支持),与Angularjs,Emberjs等大而全的框架不同,React专注的中心是Component,即组件。React认为一切页面元 素都可以抽象成组件,比如一个表单,或者表单中的某一项。
CODER-V
2023/03/04
2.9K0
前端面试之React
【React】关于组件之间的通讯
父传子也可以在内容里面传,用JSX。子组件接受时使用 this.props.children
且陶陶
2023/10/16
7000
【React】关于组件之间的通讯
react基础使用
使用jsx创建对象。并最后使用ReactDom.render(param1, param2)去对对象渲染。其中param1为js创建的变量,param2为原生dom方法选中的html元素。
Sarlren
2022/10/28
1.5K0
React 消息订阅与发布机制
我们去GitHub中查看其文档,可以发现他将subscribe定义变量成token,这就好比定时器方法的使用一样。为了我们取消定时器/订阅。
用户4793865
2023/02/03
7230
【重学React】动手实现一个react-redux
react-redux 是 redux 官方 React 绑定库。它帮助我们连接UI层和数据层。本文目的不是介绍 react-redux 的使用,而是要动手实现一个简易的 react-redux,希望能够对你有所帮助。
胡哥有话说
2019/10/24
3.4K0
关于React组件之间如何优雅地传值的探讨
闲话不多说,开篇撸代码,你可以会看到类似如下的结构: import React, { Component } from 'react'; // 父组件 class Parent extends Component { constructor() { super(); this.state = { color: 'red' }; } render() { return <Child1 { ...this.props } />
糊糊糊糊糊了
2018/05/09
1.6K0
推荐阅读
相关推荐
【React】归纳篇(九)组件间通信的3中方式之props与订阅发布机制 | subscribe | publish | 改写前面练习
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档