Javascript實(shí)現(xiàn)Vue跨組件通信的方法詳解
概述
我們都知道。
xxx.$on可以訂閱一個(gè)消息。
xxx.$emit可以發(fā)布一個(gè)消息。
xxx.$off可以取消訂閱一個(gè)消息。
思路要清晰
這個(gè)過(guò)程涉及到的幾個(gè)概念。
訂閱過(guò)程:
消息,肯定要區(qū)分,來(lái)個(gè)name。
消息也要有事做,來(lái)個(gè)handler。
一堆消息,要有地方放,來(lái)個(gè)arr。
訂閱時(shí),交代叫什么name,干什么handler。
發(fā)布過(guò)程:
發(fā)布時(shí),交代叫什么,來(lái)個(gè)name。
發(fā)布也可能有一些參數(shù),來(lái)個(gè)param。
發(fā)布時(shí),交代叫什么name,傳遞參數(shù)param。
取消訂閱過(guò)程:
取消訂閱,肯定要知道名字,來(lái)個(gè)name。
取消訂閱時(shí),交代要取消的name。
實(shí)現(xiàn)要迅猛
代碼不多
class EventBus {
constructor() {
this.arr = [];
}
on = (name, fn) => {
let filter = this.arr.filter(v => v.name === name);
if (filter.length === 0) {
this.arr.push({
name, fn
})
}
}
emit = (name, param) => {
let filter = this.arr.filter(v => v.name === name);
if (filter.length === 1) {
filter[0].fn(param);
}
}
off = (name) => {
this.arr = this.arr.filter(v => v.name !== name);
}
}
構(gòu)造:初始化事件數(shù)組。
實(shí)例的on:查重,如果重復(fù)了就啥都不干。沒(méi)重復(fù)就push。
實(shí)例的emit:查重,如果有這事件就調(diào)用。
實(shí)例的off:篩選賦值。
測(cè)試效果
代碼不多。
let bus = new EventBus();
bus.on('say', (msg) => {
console.log(msg);
});
let i = 0;
let timer = setInterval(() => {
if (i >= 30) {
bus.off('say');
clearInterval(timer);
return;
}
bus.emit('say', "你好,世界!" + i++)
}, 1000);
新建一個(gè)消息中心。
訂閱一個(gè)事件。
計(jì)時(shí)器,每隔一秒發(fā)布該消息。
30下后,取消訂閱。
運(yùn)行結(jié)果:

30秒后:

查看是否取消成功:

成功!
優(yōu)化
使用ES6的Map代替數(shù)組,效率更好。
class EventBus {
map = new Map();
on = (name, handler) => {
if (!this.map.has(name)) {
this.map.set(name, handler);
}
}
emit = (name, param) => {
let handler = this.map.get(name);
if (handler !== null) {
handler(param);
}
}
off = (name) => {
this.map.delete(name);
}
}
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
javascript將數(shù)字轉(zhuǎn)換整數(shù)金額大寫(xiě)的方法
這篇文章主要介紹了javascript將數(shù)字轉(zhuǎn)換整數(shù)金額大寫(xiě)的方法,通過(guò)自定義函數(shù)中的數(shù)組替換實(shí)現(xiàn)數(shù)字轉(zhuǎn)換整數(shù)金額大寫(xiě)的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-01-01
微信小程序?qū)崿F(xiàn)圖片選擇并預(yù)覽功能
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)圖片選擇并預(yù)覽,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
用Javascript評(píng)估用戶(hù)輸入密碼的強(qiáng)度(Knockout版)
早上看到博友6點(diǎn)多發(fā)的一篇關(guān)于密碼強(qiáng)度的文章(連接),甚是感動(dòng)(周末大早上還來(lái)發(fā)文)2011-11-11
輕松實(shí)現(xiàn)HTML和JS之間的轉(zhuǎn)化的代碼
輕松實(shí)現(xiàn)HTML和JS之間的轉(zhuǎn)化的代碼...2007-09-09
JS實(shí)現(xiàn)固定在右下角可展開(kāi)收縮DIV層的方法
這篇文章主要介紹了JS實(shí)現(xiàn)固定在右下角可展開(kāi)收縮DIV層的方法,右下角的div層可實(shí)現(xiàn)收縮與展開(kāi)的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02
ES6標(biāo)準(zhǔn) Arrow Function(箭頭函數(shù)=>)
ES6標(biāo)準(zhǔn)新增了一種新的函數(shù):Arrow Function(箭頭函數(shù)),為什么叫Arrow Function?因?yàn)樗亩x用的就是一個(gè)箭頭2020-05-05
JavaScript設(shè)計(jì)模式手寫(xiě)示例講解
這篇文章主要介紹了JavaScript設(shè)計(jì)模式手寫(xiě)示例,設(shè)計(jì)模式(Design pattern) 是解決軟件開(kāi)發(fā)某些特定問(wèn)題而提出的一些解決方案也可以理解成解決問(wèn)題的一些思路。通過(guò)設(shè)計(jì)模式可以幫助我們?cè)鰪?qiáng)代碼的可重用性、可擴(kuò)充性、 可維護(hù)性、靈活性好2022-12-12

