广播与派发适用于有祖先关系的组件间通信,原理是通过遍历组件树,用组件名(或者其它组件唯一标识)定位到对应的组件,并在找到的组件实例中调用$emit,从而触发$on监听的事件,这样就完成了一次组件间的通信。广播是父组件遍历他下面的所有后代组件,而派发的顺序则相反,是子组件向上寻找对应的父组件。
在vue中我们可以通过this.$parent获取父组件,this.$children获取子组件,this.$options.name获取当前实例的组件名,有了这些基础知识,我们就可以来设计dispatch(派发)和broadcast(广播)方法了。
这里我们把dispatch(派发)和broadcast(广播)设计成mixins混入对象,毕竟用到他们的时候还是少数,往往开发组件库的时候我们会用到。下面是emitter.js的代码:
function broadcast (componentName, eventName, params) {
for (let child of this.$children) {
let name = child.$options.name
if (name === componentName) {
child.$emit.apply(child, [eventName, params])
} else {
broadcast.call(child, componentName, eventName, params)
}
}
}
export default {
methods: {
dispatch (componentName, eventName, params) {
let parent = this.$parent || this.$root