vue通訊方式有不少,項目中用的比較多的的有pros、vuex、$emit/$on
這3種,還有provide/inject
(適合高階組件)、$attrs和$listeners
(適合高階組件)以及$parent/$child/ref、eventBus
等這3種方式。不少時候咱們都是隻會使用api,而懂得原理以及實現,但我就以爲懂得原理以及實現跟一個只會調用api的開發人員時不在同一層次的。因此這裏就像把跨組件通訊的eventBus
通訊的原理給你們展現一下。這也是本身學到大佬的的東西后並在此記錄(轉載)一下。前端
class EventBus{
constructor(){
this.event=Object.create(null);
};
//註冊事件
on(name,fn){
if(!this.event[name]){
//一個事件可能有多個監聽者
this.event[name]=[];
};
this.event[name].push(fn);
};
//觸發事件
emit(name,...args){
//給回調函數傳參
this.event[name]&&this.event[name].forEach(fn => {
fn(...args)
});
};
//只被觸發一次的事件
once(name,fn){
//在這裏同時完成了對該事件的註冊、對該事件的觸發,並在最後取消該事件。
const cb=(...args)=>{
//觸發
fn(...args);
//取消
this.off(name,fn);
};
//監聽
this.on(name,cb);
};
//取消事件
off(name,offcb){
if(this.event[name]){
let index=this.event[name].findIndex((fn)=>{
return offcb===fn;
})
this.event[name].splice(index,1);
if(!this.event[name].length){
delete this.event[name];
}
}
}
}
複製代碼
以上代碼用的是發佈訂閱模式。vue
參考連接:
一、面試官系列(2): Event Bus的實現
二、一個合格的中級前端工程師必需要掌握的 28 個 JavaScript 技巧面試