vue實現(xiàn)一個eventBus
eventBus應(yīng)該有些聽過鲫忍,其實就是一個事件發(fā)布訂閱的功能。vue提供了實例方法事件煌寇,就是once腻脏、
emit击纬。
在mainjs里面在vue原型上面掛載一個變量:
Vue.prototype.$eventBus = new Vue();
我在home頁面注冊了一個事件:
this.on('home', (msg) => { console.log('home:' + msg);})
這個事件名字就是一個key,發(fā)布的時候需要用到炕桨。
接著我在另外一個頁面live進行發(fā)布:
this.emit('home', '這是live emit')
發(fā)布訂閱要有個先后順序肯腕,一定要先訂閱,發(fā)布才會觸發(fā)姊途,比如父組件mounted里面注冊知态,子組件觸發(fā),但是子組件生命周期先執(zhí)行寂殉,父組件也不會觸發(fā)原在。你先進入home進行訂閱彤叉,接著切換到live,控制臺輸出:
home:這是live emit
如果我在back頁面也注冊一個home事件:
this.on('home', (msg) => { console.log('back:' + msg);})
然后切換頁面浮庐,每一個事件名為home的都會執(zhí)行:
home:這是live emit
back:這是live emit
而且會嚴(yán)格按照注冊順序執(zhí)行审残。
要注意的是,進入頁面就注冊事件搅轿,那么你每進入一次就會注冊一次富玷,就是說我在home和back來回切換幾次既穆,就會注冊幾次幻工,然后跳轉(zhuǎn)live頁面就會同時執(zhí)行:
home:這是live emit
back:這是live emit
home:這是live emit
back:這是live emit
在一定的業(yè)務(wù)邏輯上面黎茎,我們?nèi)绻恍枰褂媚硞€事件,最好移除:
this.off('home');
要注意踢代,這個方法會把所有注冊的home事件移除俭正,不管注冊幾次。包括$once事件也會移除串远。
$once事件是只執(zhí)行一次儿惫,相當(dāng)于執(zhí)行完之后執(zhí)行off事件。
通過vue提供的api肾请,很容易實現(xiàn)一個事件的發(fā)布訂閱,基本的on隔显、off饵逐、once、emit都很容易就實現(xiàn)了掷豺。在某些邏輯下還能當(dāng)作組件間傳遞數(shù)據(jù)來使用薄声。之后應(yīng)該會分享自己去實現(xiàn)這樣一個api。