# 组件的通讯

通过 Mixins 注入到需要通讯的组件, 并$on注册监听函数, 最后通过dispatch向上查找和broadcast向下查找的方法 $emit 去出发监听函数, 达到组件通讯的目的

# 向上查找通讯 dispatch && 向下查找通讯 broadcast

const commonMixins = {
  methods: {
    // 向下查找
    broadcast(componentName, eventName, params) {
      broadcast.call(this, componentName, eventName, params);
    },
    // 向上查找
    dispatch(componentNames, eventName, params) {
      let parent = this.$parent || this.$root;
      let name = parent.$options.name;

      while (parent && (!name || name !== componentNames)) {
        parent = parent.$parent;

        if (parent) {
          name = parent.$options.name;
        }
      }

      if (parent) {
        parent.$emit.apply(parent, [eventName].concat(params));
      }
    }
  }
};

function broadcast(componentName, eventName, params) {
  this.$children.forEach(child => {
    const name = child.$options.name;

    if (componentName === name) {
      child.$emit.call(child, eventName, params);
    } else {
      broadcast.call(child, componentName, eventName, params);
    }
  });
}

export default commonMixins;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

# 使用方法

  • 首先在需要通讯的父子组件传入Mixins方法, 这样组件内部就具备了dispatch, broadcast的方法
  • 在一个组件内部$on绑定监听函数 this.$on(监听方法名, 回调函数)
  • 在另外一个想要触发监听函数的组件内部, 调用this.dispatch或者this.broadcase this.dispatch(需要通讯的组件名, 监听方法名, 参数) this.broadcast(需要通讯的组件名, 监听方法名, 参数)
Last Updated: 9/1/2021, 2:33:08 PM