美文网首页让前端飞
高效学习 react 笔记三:组件通讯-eventHub

高效学习 react 笔记三:组件通讯-eventHub

作者: littleyu | 来源:发表于2019-06-23 18:03 被阅读6次
    • 1. 任意两个组件之间如何通信

    • 2. 发布订阅模式

    • 3. Redux 就那么回事

    上篇文章说到了组件传值可以通过 props 来传值,

    但是当我们遇到嵌套组件很深的时候或者任意组件通讯的时候

    比如说这个时候

    当我们点击 minus 的时候只有当前组件的数据在变化,但是我们希望这个数据在变化的时候通知其他组件同时变化,所以,如果继续用 props 父子组件传递的思路的话,将会是下面这个样子。

    蓝色箭头表明了数据流向,这种层层传递非常麻烦,而且很容易出现错误。

    所以 eventHub 就派上了用场。

    正因为 React 是单向数据流,所以我们只能通过 eventHub 来传递数据

    直接上手写一个 eventHub (即发布订阅模式)

    // (暂时忽略一些细节)
    const eventHub = {
      data: {},
      eventLists: {},
      on(name, fn) {
        (this.eventLists[name]
          ? this.eventLists[name]
          : (this.eventLists[name] = [])
        ).push(fn);
      },
      off(name, fn) {
        const index = this.eventLists[name].findIndex(v => v === fn);
        this.eventLists[name].splice(index, 1);
        if (this.eventLists[name].length === 0) {
          delete this.eventLists[name];
        }
      },
      trigger(name, ...arg) {
        this.eventLists[name].map(fn => fn.call(null, ...arg));
      }
    };
    

    利用这个简陋的 eventHub 我们就可以实现任意组件的通讯

    可以看到在这个例子中,我们的数据还是通过 props 传递,但是我们在最上面已经提前发布了事件,之后只需要在组件中调用即可,从中还是遵循着单项数据流的原则。

    好了,我们已经用自己的 eventHub 来实现了任意组件的通讯,

    相关文章

      网友评论

        本文标题:高效学习 react 笔记三:组件通讯-eventHub

        本文链接:https://www.haomeiwen.com/subject/nrggfctx.html