当前项目中使用eventbus时,还是有很多人直接创建一个Vue实例直接使用,哪里需要哪里导入,没有简单的处理向下。下面先说说这个方法。一个空的vue实例搭建的事件总线是在改造一个项目的时候发现的,里面的bus.js文件就是这样处理的。两行代码就搞定了。从“vue”导入Vue时;使用exportdefaultnewVue(),没那么简单。如果有这样一个空容器,这个文件必须要在需要传值的组件中导入。然后通过bus.on()绑定事件,通过bus.on()绑定事件,通过bus.on()绑定事件,通过bus.emit()分发事件。importbusfrom'@/utils/bus'//绑定事件总线.$on('event',()=>{....})//监听事件总线.$emit('event',this.tasks)这种方法使用起来也简单但不是很方便。毕竟到处都要介绍。有什么办法解决吗?继续...让我们从一个简单的方法开始。虽然看起来有点不爽,但是用起来确实好用,而且直接挂载在Vue实例上。哪里用到哪里,直接用这个就可以了。相对来说方便多了,不用到处引入文件。挂载方法如下:newVue({beforeCreate(){//尽早执行挂载全局事件总线对象的操作Vue.prototype.$bus=this;},router,store,render:h=>h(App)}).$mount('#app');这种方式虽然挂载简单,但是在使用上还是有点不尽如人意。不信你看看://绑定事件this.$bus.$on('send',()=>{//Usingevents});//分发事件this.$bus.$发射('发送','发射');乍一看,这不是很好吗,很简单啊!但是我有洁癖怎么办,我有强迫症怎么办,我不想看到两个$标志,怎么办?我只想要以下方法://绑定事件this.$bus.on('send',()=>{//Usingevents});//分发事件this.$bus.emit('send','发射');那你说,大家都用$on和$emit,为什么不行,不行就自己弄吧,干就是了,谁怕谁,安排!先想好复杂和简单的方式,你想要什么样的效果,比如我不想用文件的时候就得导入,想导入一次,到处都可以用;$的两种调用方式我不要,还是看心情用吧;也可以直接通过Vue对象使用。思路大概梳理好了,那就动手吧,保持简单,直接上传代码!///utils/bus.js'usestrict';从'vue'导入Vue;functionVueBus(Vue){letbus=newVue();Object.defineProperties(bus,{on:{get(){returnthis.$on.bind(this);}},once:{get(){returnthis.$once.bind(this);}},关闭:{get(){returnthis.$off.bind(this);}},emit:{get(){returnthis.$emit.bind(this);}}});Object.defineProperty(Vue,'bus',{get(){returnbus;}});Object.defineProperty(Vue.prototype,'$bus',{get(){returnbus;}});if(typeofwindow!=='undefined'&&window.Vue){window.Vue.use(VueBus);}returnbus;}exportdefaultVueBus;/***import{EventBus}from'@/libs/bus';**EventBus.$bus.on('拦截器',()=>{});*EventBus.$bus.emit('拦截器','值');*/constEventBus=newVue();export{EventBus};看看怎么用,有没有想象中的那么简单,在main.js中引用import,通过vue.use()注入,加载方式很简单importEventBusfrom'@/libs/bus';Vue.use(事件总线);使用起来更加灵活,想怎么用就怎么用,并且支持下面几种方式,至于$off和$once,和$on和$emit一样使用。//绑定事件this.$bus.on('send',this.handleSend);//推荐this.$bus.$on('send',this.handleSend);Vue.bus.on('发送',this.handleSend);Vue.bus.$on('send',this.handleSend);//调度事件this.$bus.emit('send','');//推荐这个。$bus.$emit('send','emit');Vue.bus.emit('send','emit');Vue.bus.$emit('send','emit');也可以按需导入使用,有在非组件js文件中使用时,需要直接引用,这时可以:import{EventBus}from'@/libs/bus';EventBus.$bus。on('拦截器',()=>{});EventBus.$bus.emit('拦截器','值');以上方法都可以。它更灵活吗?想怎么用就怎么用,再也不用担心调用方法写错了。如果你觉得太灵活了,可以砍掉,对团队进行规范性的约束,统一执行。任何事物都有两面性,没有好坏之分,全凭使用者。好钢要用在刀刃上,不能滥用。还有其他更好的方法先用。
