React 中组件间通信的几种方式

1、父组件向子组件通信
父组件通过向子组件传递 props,子组件得到 props 后进行相应的处理


image.png

2、子组件向父组件通信


image.png

3、跨级组件之间通信
父组件向子组件的子组件通信,向更深层的子组件通信

思路1:中间组件层层传递 props
如果父组件结构较深,那么中间的每一层组件都要去传递 props,增加了复杂度,并且这些 props 并不是这些中间组件自己所需要的。当组件层次在三层以内可以采用这种方式,当组件嵌套过深时,就考虑其他方式

思路2:使用 context 对象
context 相当于一个全局变量,是一个大容器,我们可以把要通信的内容放在这个容器中,这样一来,不管嵌套有多深,都可以随意取用
使用 context 也很简单,需满足:

1、上级组件要声明自己支持 context,提供 context 中属性的 PropTypes,并提供一个函数来返回相应的 context 对象
2、子组件要声明自己需要使用 context,并提供其需要使用的 context 属性的 PropTypes
3、父组件需提供一个 getChildContext 函数,以返回一个初始的 context 对象

如果组件中使用构造函数(constructor),还需要在构造函数中传入第二个参数 context,并在 super 调用父类构造函数是传入 context,否则会造成组件中无法使用 context。
Sub.js

import React from "react";
import SubSub from "./SubSub";
const Sub = (props) =>{
    return(
        <div>
            <SubSub />
        </div>
    );
}
export default Sub;

SubSub.js:

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>
        );
    }
}

image.png
image.png
image.png

4、非嵌套组件间通信
或者说是兄弟组件间
首先需要:

我们需要使用一个 events 包:
npm install events --save
新建一个 ev.js,引入 events 包,并向外提供一个事件对象,供通信时使用:

image.png
image.png

通信参考网址:https://blog.csdn.net/zhengjie0722/article/details/81979919

本文章参考了,原创来源于https://www.jianshu.com/p/fb915d9c99c4,若本文有错误的地方,请大家帮忙指出哦!谢谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在使用 React 的过程中,不可避免的需要组件间进行消息传递(通信),组件间通信大体有下面几种情况: 父组件向子...
    柏丘君阅读 93,388评论 7 80
  • 首次发表在个人博客 需要组件之进行通信的几种情况 父组件向子组件通信 子组件向父组件通信 跨级组件通信 没有嵌套关...
    IOneStar阅读 5,237评论 0 10
  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 12,710评论 1 33
  • 这些年,生命中遇到了形形色色的人,有同学有同事,有各种链条接触认识的朋友,但是,相比从小到大的朋友情意真的是逊色很...
    日常不想上班阅读 1,612评论 0 0
  • 今天雪停了,但路面结冰了,操场上白茫茫一片,一到下课时间,满操场都是欢声笑语。我一直是一个童心未泯的人,就约了几个...
    阿梨梨梨阅读 1,612评论 1 3

友情链接更多精彩内容