Vue?eventBus事件總線封裝后再用的方式
前言
現(xiàn)在的項目中是不是在使用 eventbus 的時候,還有很多人都是直接創(chuàng)建一個vue 實例直接使用的,哪里需要哪里引入,而沒有簡單的處理下。接下來就先說下這種方式。
空vue實例構(gòu)建的事件總線
在改造一個項目的時候就發(fā)現(xiàn),里面的 bus.js 文件中就是這么處理的。兩行代碼搞定。
import Vue from "vue"; export default new Vue()
使用的時候,就沒那么簡單了,有這么一個空的容器,在需要傳值的組件里就得引入這個文件。然后通過 bus.on()綁定事件,通過bus.on() 綁定事件,通過 bus.on()綁定事件,通過bus.emit()進行分發(fā)事件。
import bus from'@/utils/bus' // 綁定事件 bus.$on('event',()=>{....}) // 監(jiān)聽事件 bus.$emit('event',this.tasks)
這種方式使用起來也簡單但也不太方便,畢竟到處都要引入下,那有沒有什么辦法可以解決呢。繼續(xù)...
簡單的方式
先來個簡單的吧,雖然看上去有點不太習(xí)慣,但的確也挺好使的,而且直接掛載到vue實例上,哪里用哪里直接 this
即可,相對來說方便多了,不用到處引入文件了。掛載方式如下:
new Vue({ beforeCreate() { // 盡量早地執(zhí)行掛載全局事件總線對象的操作 Vue.prototype.$bus = this; }, router, store, render: h => h(App) }).$mount('#app');
這種方式雖然掛載簡單,但是使用上還是有點不能盡如人意,不信你看:
// 綁定事件 this.$bus.$on('send', ()=>{ // 使用事件 }); // 分發(fā)事件 this.$bus.$emit('send', 'emit');
猛地一看,這不挺好的么,挺簡單的啊!可是我有潔癖怎么辦,我有強迫癥怎么辦,我就不想看到兩個 $
符怎么辦我就只想要下面的這種方式的:
// 綁定事件 this.$bus.on('send', ()=>{ // 使用事件 }); // 分發(fā)事件 this.$bus.emit('send', 'emit');
那你說,人家都是 $on
、$emit
的用的,怎么就不行了啊,實在不行就自己改造個吧,說干就干,who 怕 who,安排!
復(fù)雜又簡單的方式
先構(gòu)思下,想要個什么樣效果的,比如,我不想要用的時候都要引入下文件,要一次引入,處處可用; 我不想要兩個 $
的調(diào)用方式,或者說可以隨心情的使用; 再者通過Vue對象也可以直接使用。
思路大概理了理,那就開干唄,簡單干脆點,直接上代碼!
'use strict'; function VueBus(Vue) { let bus = new Vue(); Object.defineProperties(bus, { on: { get() { return this.$on.bind(this); } }, once: { get() { return this.$once.bind(this); } }, off: { get() { return this.$off.bind(this); } }, emit: { get() { return this.$emit.bind(this); } } }); Object.defineProperty(Vue, 'bus', { get() { return bus; } }); Object.defineProperty(Vue.prototype, '$bus', { get() { return bus; } }); if (typeof window !== 'undefined' && window.Vue) { window.Vue.use(VueBus); } return bus; } export default VueBus;
來看看使用方式吧,是不是跟想象的一樣簡單,在 main.js
中引入,并通過 vue.use()
注入進來,加載方式就這么簡單。
import EventBus from '@/libs/bus'; Vue.use(EventBus);
使用上更靈活了,想怎么用就怎么用,支持以下幾種方式,至于$off
、$once
使用上通 $on
、$emit
一樣。
// 綁定事件 this.$bus.on('send', this.handleSend); // 推薦 this.$bus.$on('send', this.handleSend); Vue.bus.on('send', this.handleSend); Vue.bus.$on('send', this.handleSend); // 分發(fā)事件 this.$bus.emit('send', ''); // 推薦 this.$bus.$emit('send', 'emit'); Vue.bus.emit('send', 'emit'); Vue.bus.$emit('send', 'emit');
上面這幾種方式均可。是不是更靈活了呢。想怎么用就怎么用,再也不用擔(dān)心會寫錯調(diào)用方式了。
總結(jié)
到此這篇關(guān)于Vue eventBus事件總線封裝后再用的文章就介紹到這了,更多相關(guān)Vue eventBus事件總線封裝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
element-ui中的select下拉列表設(shè)置默認值方法
今天小編就為大家分享一篇element-ui中的select下拉列表設(shè)置默認值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08vue單向以及雙向數(shù)據(jù)綁定方式(v-bind和v-model的使用)
這篇文章主要介紹了vue單向以及雙向數(shù)據(jù)綁定方式(v-bind和v-model的使用),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04vue?this.$router和this.$route區(qū)別解析及路由傳參的2種方式?&&?this.$route
this.$router?相當(dāng)于一個全局的路由器對象,包含了很多屬性和對象(比如?history?對象),任何頁面都可以調(diào)用其?push(),?replace(),?go()?等方法,本文給大家介紹Vue中this.$router與this.$route的區(qū)別?及push()方法,感興趣的朋友跟隨小編一起看看吧2023-10-10vue登錄頁面回車執(zhí)行事件@keyup.enter.native問題
這篇文章主要介紹了vue登錄頁面回車執(zhí)行事件@keyup.enter.native問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03Vue?echarts@4.x中國地圖及AMap相關(guān)API使用詳解
這篇文章主要為大家介紹了Vue使用echarts@4.x中國地圖及AMap相關(guān)API使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Vue3?實現(xiàn)驗證碼倒計時功能(刷新保持狀態(tài))
倒計時的運用場景是需要經(jīng)常用到的,但是根據(jù)業(yè)務(wù)的不同,好比手機驗證碼或者是郵箱驗證碼之類的,即使用戶跳轉(zhuǎn)到其它頁面或者刷新,再次回到登錄也,驗證碼的倒計時也得保持狀態(tài),下面通過本文給大家分享Vue3?驗證碼倒計時功能實現(xiàn),感興趣的朋友一起看看吧2022-08-08