国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

實(shí)現(xiàn)一個(gè)發(fā)布訂閱

Aceyclee / 3145人閱讀

摘要:表示事件類型回調(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

相關(guān)文章

  • 發(fā)布訂閱模式-實(shí)現(xiàn)公眾號(hào)訂閱/內(nèi)容發(fā)布/取消訂閱功能

    摘要:?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é)果...

    XiNGRZ 評(píng)論0 收藏0
  • JavaScript 發(fā)布-訂閱模式

    摘要:發(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ā)變得更加高效方便。 一...

    13651657101 評(píng)論0 收藏0
  • 訂閱發(fā)布模式和觀察者模式的區(qū)別

    摘要:或許以前認(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ā)送給特...

    ysl_unh 評(píng)論0 收藏0
  • JavaScript 設(shè)計(jì)模式(六):觀察者模式與發(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è)圖,甜...

    bingo 評(píng)論0 收藏0
  • JavaScript設(shè)計(jì)模式之發(fā)布-訂閱模式(觀察者模式)-Part1

    摘要:設(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ì)象都將得到通知。 例...

    muzhuyu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<