当前位置: 首页 > Web前端 > vue.js

vue自己实现的调度广播-调度广播

时间:2023-03-31 19:02:46 vue.js

主要解决的问题是组件之间的跨层通信。为什么需要自己实现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<模板>

我是父组件

触发事件
child.vue这样就可以实现跨层级的组件自定义通信,但是需要注意一个问题问题:subscription必须先release,也就是说先有on再emit。父子组件的渲染顺序。实例创建的顺序是子组件在父组件之前渲染。所以当子组的mounted事件派发时,父组件中的mounte在父组件中监听不到,父组件的create先于子组件,所以父组件中的create可以监控