主要解决的问题是组件之间的跨层通信。为什么需要自己实现dispatch和broadcast?因为在做独立组件开发或者库的时候,最好不要依赖第三方库。为什么不使用提供和注入?因为它的使用场景主要是让子组件获取上层组件的状态,跨层组件之间建立主动权。提供与依赖注入的关系。那么有两种场景它解决不了:父组件给子组件传递数据(支持跨级);子组件向父组件传递数据(支持跨级)。代码如下:emitter.jsfunctionbroadcast(componentName,eventName,params){this.$children.forEach(child=>{constname=child.$options.name;if(name===componentName){child.$emit.apply(child,[eventName].concat(params));}else{//todo如果params是空数组,接收到的会是undefinedbroadcast.apply(child,[componentName,eventName].concat([params]));}});}exportdefault{方法:{dispatch(componentName,eventName,params){letparent=this.$parent||这个.$root;letname=parent.$options.name;while(parent&&(!name||name!==componentName)){parent=parent.$parent;if(parent){name=parent.$options.name;}}if(parent){parent.$emit.apply(parent,[eventName].concat(params));}},broadcast(componentName,eventName,params){broadcast.call(this,componentName,eventName,params);}}};parent.vue<模板>
