JavaScript中EventBus實現(xiàn)對象之間通信
一、什么是EventBus?
我個人理解:EventBus 可以實現(xiàn)對象之間的通信,當數(shù)據(jù)或某些特性發(fā)生改變時,能自動監(jiān)聽事件作出一些改變。還有更多的內(nèi)容可能我還沒有拓寬。怎么實現(xiàn)通信呢?這里通過一個例子可以理解到其中的精髓。
二、一個簡單的例子
add(){
data+=1;
render(data);
},
minus(){
data-=1;
render(data);
},
multiply(){
data*=2;
render(data);
},
divide(){
data/=2;
render(data);
},
以上代碼是進行加減乘除的運算,數(shù)據(jù)data改變后,對數(shù)據(jù)data進行渲染,調(diào)用到渲染函數(shù)render();
有沒有覺得這樣很麻煩,代碼重復非常多,但是想表達的意思就是一個:data 只要進行更新,就調(diào)用一次渲染函數(shù)render()
問題來了:有沒有辦法簡化呢?只要data一改變,就自動調(diào)用render()函數(shù)
三、代碼演示實例
const eventbus=$({}); // 使用jQuery庫創(chuàng)建了一個eventbus。
let xx = {
data:{
n:100,
}
}
updata(data){
Object.assign(xx.data,data); //批量賦值
eventbus.trigger('updataed:xx.data'); //觸發(fā)事件,事件名為:'updataed:xx.data'
}
/* 調(diào)用jquer封裝的事件監(jiān)聽函數(shù) */
eventbus.on('updataed:xx.data',()=>{
render(xx.data);
})
/* 改進后的加減乘除函數(shù) */
add(){
updata({n:xx.data.n+1});
},
minus(){
updata({n:xx.data.n-1});
},
multiply(){
updata({n:xx.data.n*2});
},
divide(){
updata({n:xx.data.n/2});
}
只要一調(diào)用updata()函數(shù),就會使eventbus.trigger('updataed:xx.data')觸發(fā),然后事件監(jiān)聽就會觸發(fā),自動調(diào)用render()函數(shù)進行渲染
四、使用class 封裝+繼承EventBus
class EventBus{
constructor(){
this.eventbus=$(window); //使用jquery將eventbus掛載到全局window上
}
on(eventName,fn){
this.eventbus.on(eventName,fn);
}
trigger(eventName){
this.eventbus.trigger(eventName);
}
off(eventName,fn){
this.eventbus.off(eventName,fn);
}
}
const eventbus=new EventBus();
eventbus.trigger('updated:xx.data')
eventbus.on('updated:xx.data',()=>{
render(xx.data);
})
eventbus.off('updated:xx.data')
/* 繼承EventBus */
class module extends EventBus{
constructor(){
super(); //必須繼承父類的構(gòu)造函數(shù)constructor
}
}
module.trigger('updated:xx.data')
module.on('updated:xx.data',()=>{
render(xx.data);
})
module.off('updated:xx.data')
為何要進行class 封裝和繼承EventBus?
答:為了讓代碼更加格式化,不僅在這里能用到EventBus,在其他地方也能使用上。尤其在模塊化的操作中,封裝+繼承這些就顯得十分的重要。這樣能讓代碼有更好的維護性。其他模塊使用到eventbus時的還能有更多的變樣,可以覆蓋重寫父類方法或者再添加一些方法。
到此這篇關(guān)于JavaScript中EventBus實現(xiàn)對象之間通信的文章就介紹到這了,更多相關(guān)JavaScript EventBus對象通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JS addEventListener()和attachEvent()方法實現(xiàn)注冊事件
- JS事件循環(huán)機制event loop宏任務微任務原理解析
- Js on及addEventListener原理用法區(qū)別解析
- javascript事件循環(huán)event loop的簡單模型解釋與應用分析
- js中addEventListener()與removeEventListener()用法案例分析
- node.js中對Event Loop事件循環(huán)的理解與應用實例分析
- node.JS事件機制與events事件模塊的使用方法詳解
- JavaScript 鼠標事件(MouseEvent)案例講解
相關(guān)文章
ES6(ECMAScript 6)新特性之模板字符串用法分析
這篇文章主要介紹了ES6(ECMAScript 6)新特性之模板字符串用法,簡單介紹了ES6模板字符串的概念、功能并結(jié)合實例形式分析了ES6模板字符串的用法,需要的朋友可以參考下2017-04-04
JavaScript中判斷數(shù)據(jù)類型的方法總結(jié)
這篇文章主要為大家詳細介紹了一些JavaScript中判斷數(shù)據(jù)類型的方法,文中的示例代碼講解詳細,具有一定的學習價值,需要的小伙伴可以了解一下2023-07-07
你不知道的 TypeScript 高級類型(小結(jié))
這篇文章主要介紹了你不知道的 TypeScript 高級類型(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08

