react组件通信

128 阅读2分钟

\

React 组件通信

\

  1. 父子组件间

基于行内属性传参(可以是普通的状态或者函数),props接收,父传子

  1. EventBus发布订阅实现
  1. 执行上下文传参,用于祖宗组件和后代组件之间的传参
  1. redux...公共状态管理
  1. 浏览器数据缓存

\

......

父子组件间

基于行内属性传参(可以是普通的状态或者函数),this.props接收,父传子

\

执行上下文传参,用于祖宗组件和后代组件之间的传参

\

祖宗组件把需要传递的状态放在执行上下文中

static childContextTypes={

// 规定执行上下文中传递数据的规则

}

\

生命周期 getChildContext

getChildContext 第一次调用是在状态初始化之后,如果修改state状态,会重新调用该生命周期,把执行上下文中的数据更新

通过返回值,把数据放在执行上下文中,供后代组件调用

getChildContext(){

return {}

// 返回值是放在上下文中的数据

}

后代组件就可以在执行上下文中拿到传递的状态

static contextTypes={}

这是后代组件,规定从执行上下文中拿到的值类型,然后通过this.context 获取数据

后代组件的规则要和祖宗组件定义的规则保持一致

后代组件接收上下文数据时,必须要规定类型,给哪个属性规定类型,就接收哪个,不规定就不接受

\

*执行上下文新语法

\

创建 context.js

import React from "react";

React.createContext(); 创建一个执行上下文对象

let ThemeContext = React.createContext();

export default ThemeContext;

父组件

import ThemeContext from "./context";

子 第一种

把执行上下文对象赋值给contextType属性

然后就可以通过this.context调用

子 第二种

ThemeContext.Consumer 内置组件,是提供给后代组件消费

(使用)执行上下文中的数据

组件写个箭头函数,箭头函数的形参就是存储的执行上下文中的数据

箭头函数的返回值,来写jsx元素

\

\

发布订阅EventBus

\

EventBus.js

class EventBus {
  //事件池
  pond = {};
  //往事件池中添加事件
  $on(name, func) {
    // 如果事件池中没有这个事件类型,就增加一个事件类型为空数组
    // name func 形参 传递进来的事件类型和函数名
    if (!this.pond.hasOwnProperty(name)) {
      this.pond[name] = [];
    }
    // 数组中有这个函数,直接return
    if (this.pond[name].some((item) => item === func)) return;
    // 数组中没有这个函数,push进去
    this.pond[name].push(func);
  }
  // 触发事件池中的事件
  $emit(name, ...arg) {
    let ary = this.pond[name] || [];
    ary.forEach((item) => {
      item(...arg);
    });
  }
  $off(name, func) {
    // 如果没有这个事件类型,直接return
    if (!this.pond[name]) return;
    let i = this.pond[name].indexOf(func);
    if (i === -1) return;
    this.pond[name].splice(i, 1);
  }
}
export default new EventBus();

\

用生命周期 componentDidMount 第一次渲染完成之后

给事件池增加方法

给事件池增加方法.

触发事件池中的方法

Vue组件间的通信

  1. 父子组件间

基于行内属性传参,props接收,父传子

自定义事件@xxx="fn",子组件内通过this.$emit('xxx'),子传父,实际上就是子组件调用父组件的函数并传参

  1. 祖宗组件和后代组件之间的传参

执行上下文或者叫做依赖注入

provide,inject;祖宗组件使用provide属性将数据传给后代,后代组件使用inject属性接收

  1. parentparent children/$refs

  1. EventBus发布订阅实现的

$on('xx',func)把事件放入事件池中

$emit('xx',参数)执行事件池中的事件

  1. vuex 公共状态管理

  1. 浏览器数据缓存

  1. attrs & listeners

......

\

\

\

\

\

\

\

\

\

\

\

\

\

\

\

\

\

\

\