1.借助父组件传参
父组件为 App 子组件为 A 和 B 他两个是同级的, A 组件派发事件通过 App.vue 接受 A 组件派发的事件然后在 Props 传给 B 组件 也是可以实现的
缺点就是比较麻烦 ,无法直接通信,只能充当桥梁
2.Event Bus
在Vue2 可以使用$emit 传递 $on 监听 emit 传递过来的事件,原理其实是运用了JS 设计模式之发布订阅模式,挂载到 Vue config 全局就可以使用啦
type BusClass<T> = {
emit: (name: T) => void;
on: (name: T, callback: Function) => void;
};
type BusParams = string | number | symbol;
type List = {
[key: BusParams]: Array<Function>;
};
class Bus<T extends BusParams> implements BusClass<T> {
list: List;
constructor() {
this.list = {};
}
emit(name: T, ...args: Array<any>) {
let eventName: Array<Function> = this.list[name];
eventName.forEach((ev) => {
ev.apply(this, args);
});
}
on(name: T, callback: Function) {
let fn: Array<Function> = this.list[name] || [];
fn.push(callback);
this.list[name] = fn;
}
}
export default new Bus<number>();