React 初探(四)- 任意两组件通信、发布订阅模式、单项数据

2019-01-09  本文已影响22人  bowen_wu

概述

上次研究了父子组件和有层次关系的组件之间是如何通信的,那么任意两个组件之间是如何通信的呢?

Demo

Demo 结构如下图所示:


Demo 结构示意图

demo 代码在线运行

效果图

之后需要使 Son2 组件和 Son3 组件之间更新一个数据,所以需要构造一个数据 money,这个 money 变量作为全局变量,需要传给所有的组件,money 传给所有组件在线运行

效果图

现在可以在 Son2 组件和 Son3 组件之间更新数据 money 了。当 Son2 组件更改 money 数据时,如何通知其他组件呢?例如 Son3 组件?

如果 Son2 组件更改了全局变量 money 之后再 setState 组件 Son2 是可以进行数据的更新的,但是其他组件都接收不到更新,因为其他组件都没有进行 setState

所以当组件 Son2 要进行更新时,需要引入一个 event center roleSon2 组件将更新告知 event center roleevent center role 将通知其他组件,例如 Son3 组件

发布订阅模式

通过上述的 demo 了解到需要一个 event center role,这个 event center role 便是 发布订阅模式( EventHub || EventBus )。以下是实现 EventHub 的代码

let events = {};
let eventHub = {
    emit(eventName, data) {
        if(!events[eventName]) {
            return;
        }
        events[eventName].forEach(callback => {
            callback.call(null, data);
        })
    },
    on(eventName, callback) {
        if(!events[eventName]) {
            events[eventName] = []
        }
        events[eventName].push(callback);
    }
}

通过上述 EventHub 代码,便可以进行组件之间的通信了

单项数据流

根据上述 demo 了解到现在进行数据更新的方法是:首先有一个 event center role,它主要负责订阅( on )、发布( emit )事件,其次需要一个 steward role,它会在开始的时候去订阅( on )事件,只要触发这个事件,那么 steward role 则去更新数据并且重新 render 整个 App,那么当组件发布( emit )这个事件( eventName )后,steward role 将会处理这个事件。此时数据流便是单项数据流

单项数据流示意图

特点:

缺点

Redux

名词

使用 Redux

将上述 demo 使用 Redux 改写改写的不同之处)并在线运行,此次需要引入 Redux 库,通过 Redux 官网中文)找到 Counter 示例,在示例中查看 index.js 文件,通过 index.js 文件进行改写。

注意: Redux 内置了 EventHub,其中的 reducer 作用和 steward role 相似

优点

缺点

上一篇下一篇

猜你喜欢

热点阅读