摘要:表示事件類型回調(diào)函數(shù),當(dāng)監(jiān)聽(tīng)的事件類型觸發(fā)時(shí),執(zhí)行函數(shù)冒泡還是捕獲等參數(shù)原生中,我們通過(guò)注冊(cè)事件訂閱,比如鼠標(biāo)點(diǎn)擊,傳入回調(diào)函數(shù)在注冊(cè)的事件觸發(fā)時(shí)要執(zhí)行的函數(shù),那么鼠標(biāo)點(diǎn)擊時(shí)發(fā)布,傳入的回調(diào)函數(shù)就會(huì)執(zhí)行。
在常用的MVVM框架比如vue,組件間通信可能會(huì)有以下三種情況:
1. 父子通信:通過(guò)props 2. 非父子組件組件用eventBus通信 3. 如果項(xiàng)目很大,數(shù)據(jù)需要共享到多個(gè)組件(跨組件通信,改同一個(gè)數(shù)據(jù)等),用vuex管理
那么文中的eventBus是怎么實(shí)現(xiàn)的呢,就是根據(jù)發(fā)布訂閱模式。發(fā)布訂閱模式應(yīng)用廣泛,js事件就是一個(gè)經(jīng)典的發(fā)布訂閱模式。看個(gè)例子addEventListener
EventTarget.addEventListener() 方法將指定的監(jiān)聽(tīng)器注冊(cè)到 EventTarget 上,當(dāng)該對(duì)象觸發(fā)指定的事件時(shí),指定的回調(diào)函數(shù)就會(huì)被執(zhí)行,事件目標(biāo)可以是一個(gè)文檔上的元素 Document 本身。
target.addEventListener(type, listener, options); //type 表示事件類型(eg:click) //listener 回調(diào)函數(shù),當(dāng)監(jiān)聽(tīng)的事件類型觸發(fā)時(shí),執(zhí)行l(wèi)istener函數(shù) //options 冒泡還是捕獲等參數(shù)
原生js中,我們通過(guò)addEventListener注冊(cè)事件(訂閱),比如鼠標(biāo)點(diǎn)擊,傳入回調(diào)函數(shù)(在注冊(cè)的事件觸發(fā)時(shí)要執(zhí)行的函數(shù)),那么鼠標(biāo)點(diǎn)擊時(shí)(發(fā)布),傳入的回調(diào)函數(shù)就會(huì)執(zhí)行。除了原生js事件。
那一個(gè)簡(jiǎn)單的發(fā)布訂閱模式怎么實(shí)現(xiàn)呢?定義一個(gè)EventEmitter類,它有以下幾個(gè)元素:
單例對(duì)象,維護(hù)訂閱者:?jiǎn)卫J骄褪菫楸WC不同的人實(shí)例化EventEmitter類之后,拿到的狀態(tài)是同一個(gè)。
訂閱方法:傳入訂閱的事件類型及回調(diào)函數(shù),訂閱事件
發(fā)布方法:傳入發(fā)布的事件類型及參數(shù)(傳給回調(diào)函數(shù)的),發(fā)布事件。發(fā)布時(shí),會(huì)執(zhí)行訂閱時(shí)傳入的回調(diào)函數(shù)
移除方法:移除訂閱(監(jiān)聽(tīng))的回調(diào)函數(shù)
代碼如下:
class EventEmitter { constructor(){ //單例模式 this._events = this._events || new Map(); } //發(fā)布(觸發(fā)事件) emit(type, ...args){ //拿到訂閱者的回調(diào)函數(shù) var handler = this._events.get(type); if(!handler){ return; } //發(fā)布時(shí),依次執(zhí)行訂閱者的回調(diào) for(var i = 0; i< handler.length; i++){ handler[i].apply(this, args); } } //訂閱(監(jiān)聽(tīng)事件) addListener(type, func){ var handler = this._events.get(type); //如果還沒(méi)有同類型的訂閱,新創(chuàng)建一個(gè) if(!handler){ this._events.set(type, [func]); return; } //把回調(diào)函數(shù)塞入數(shù)組 handler.push(func); } //移除 removeListener(type, func){ var handler = this._events.get(type); if(!handler){ return; } for(var i = handler.length; i>0; i--){ //找到自己要移除的函數(shù),匿名函數(shù)不能移除 if(handler[i] == func){ handler.splice(i, 1); } } } }
該實(shí)現(xiàn)只是探究原理,異常處理之類的都沒(méi)做。想了解單例模式可以看:《javaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》(我還沒(méi)看完emmm)
參考:
[eventBus實(shí)現(xiàn)][2]
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/94105.html
摘要:?jiǎn)栍^察者模式和發(fā)布訂閱模式的有什么區(qū)別答一下,相信都會(huì)有滿屏的結(jié)果告訴你什么是發(fā)布訂閱模式,但還是希望自己通過(guò)一些例子融入去實(shí)現(xiàn)概念理解創(chuàng)建一個(gè)對(duì)象存儲(chǔ)所有訂閱者與其調(diào)用添加訂閱者函數(shù)時(shí)入?yún)⒂校瑢⑵浯鎯?chǔ)到調(diào)用發(fā)布訂閱信息函數(shù)時(shí)再根據(jù)入 問(wèn):觀察者模式和發(fā)布訂閱模式的有什么區(qū)別? 答:https://juejin.im/post/5a14e9... Google一下,相信都會(huì)有滿屏的結(jié)果...
摘要:發(fā)布訂閱模式訂閱者把自己想訂閱的事件注冊(cè)到調(diào)度中心,當(dāng)發(fā)布者發(fā)布該事件到調(diào)度中心,也就是該事件觸發(fā)時(shí),由調(diào)度中心統(tǒng)一調(diào)度訂閱者注冊(cè)到調(diào)度中心的處理代碼。 發(fā)布-訂閱模式,看似陌生,其實(shí)不然。工作中經(jīng)常會(huì)用到,例如 Node.js EventEmitter 中的 on 和 emit 方法;Vue 中的 $on 和 $emit 方法。他們都使用了發(fā)布-訂閱模式,讓開(kāi)發(fā)變得更加高效方便。 一...
摘要:或許以前認(rèn)為訂閱發(fā)布模式是觀察者模式的一種別稱,但是發(fā)展至今,概念已經(jīng)有了不少區(qū)別。參考文章訂閱發(fā)布模式和觀察者模式真的不一樣 首選我們需要先了解兩者的定義和實(shí)現(xiàn)的方式,才能更好的區(qū)分兩者的不同點(diǎn)。 或許以前認(rèn)為訂閱發(fā)布模式是觀察者模式的一種別稱,但是發(fā)展至今,概念已經(jīng)有了不少區(qū)別。 訂閱發(fā)布模式 在軟件架構(gòu)中,發(fā)布-訂閱是一種消息范式,消息的發(fā)送者(稱為發(fā)布者)不會(huì)將消息直接發(fā)送給特...
摘要:觀察者模式維護(hù)單一事件對(duì)應(yīng)多個(gè)依賴該事件的對(duì)象關(guān)系發(fā)布訂閱維護(hù)多個(gè)事件主題及依賴各事件主題的對(duì)象之間的關(guān)系觀察者模式是目標(biāo)對(duì)象直接觸發(fā)通知全部通知,觀察對(duì)象被迫接收通知。 觀察者模式(Observer) 觀察者模式:定義了對(duì)象間一種一對(duì)多的依賴關(guān)系,當(dāng)目標(biāo)對(duì)象 Subject 的狀態(tài)發(fā)生改變時(shí),所有依賴它的對(duì)象 Observer 都會(huì)得到通知。 簡(jiǎn)單點(diǎn):女神有男朋友了,朋友圈曬個(gè)圖,甜...
摘要:設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐讀書(shū)筆記。發(fā)布訂閱模式又叫觀察者模式,它定義了對(duì)象之間的一種一對(duì)多的依賴關(guān)系。附設(shè)計(jì)模式之發(fā)布訂閱模式觀察者模式數(shù)據(jù)結(jié)構(gòu)和算法系列棧隊(duì)列優(yōu)先隊(duì)列循環(huán)隊(duì)列設(shè)計(jì)模式系列設(shè)計(jì)模式之策略模式 《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》讀書(shū)筆記。 發(fā)布-訂閱模式又叫觀察者模式,它定義了對(duì)象之間的一種一對(duì)多的依賴關(guān)系。當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴它的對(duì)象都將得到通知。 例...
閱讀 917·2021-09-09 09:32
閱讀 2887·2021-09-02 10:20
閱讀 2708·2021-07-23 11:24
閱讀 836·2019-08-30 15:54
閱讀 3639·2019-08-30 15:54
閱讀 1351·2019-08-30 11:02
閱讀 2852·2019-08-26 17:40
閱讀 1133·2019-08-26 13:55