日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

EventBus的实现

發(fā)布時(shí)間:2023/12/6 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EventBus的实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

EventBus概要

EventBus是消息傳遞的一種方式,基于一個(gè)消息中心,訂閱和發(fā)布消息的模式。這種方式的實(shí)現(xiàn)不僅僅局限于前端,在iOS中的消息消息中心也是如此實(shí)現(xiàn)。

  • 設(shè)計(jì)模式:訂閱者發(fā)布者模式,這種設(shè)計(jì)模式在前端很常見(jiàn)。
  • API的設(shè)計(jì):

    2.1 只能構(gòu)造一個(gè)消息對(duì)象

    2.2 on('msgName', func)訂閱消息,msgName:訂閱的消息名稱 func: 訂閱的消息

    2.3 one('msgName', func)僅訂閱一次消息,后訂閱的會(huì)替換前面訂閱的消息

    2.4 emit('msgName', msg)發(fā)布消息 msgName:消息名稱 msg:發(fā)布的消息

    2.5 off('msgName')移除消息

  • 實(shí)現(xiàn)EventBus

    // 構(gòu)造EventBus function EventBusClass() {this.msgQueues = {} }EventBusClass.prototype = {// 將消息保存到當(dāng)前的消息隊(duì)列中on: function(msgName, func) {if (this.msgQueues.hasOwnProperty(msgName)) {if (typeof this.msgQueues[msgName] === 'function') {this.msgQueues[msgName] = [this.msgQueues[msgName], func] } else {this.msgQueues[msgName] = [...this.msgQueues[msgName], func] }} else {this.msgQueues[msgName] = func;}},// 消息隊(duì)列中僅保存一個(gè)消息one: function(msgName, func) {// 無(wú)需檢查msgName是否存在this.msgQueues[msgName] = func;},// 發(fā)送消息emit: function(msgName, msg) {if (!this.msgQueues.hasOwnProperty(msgName)) {return}if (typeof this.msgQueues[msgName] === 'function') {this.msgQueues[msgName](msg)} else {this.msgQueues[msgName].map((fn) => {fn(msg)})}},// 移除消息off: function(msgName) {if (!this.msgQueues.hasOwnProperty(msgName)) {return}delete this.msgQueues[msgName]} }// 將EventBus放到window對(duì)象中 const EventBus = new EventBusClass() window.EventBus = EventBus

    使用EventBus

    // 訂閱消息 function subscribe() {EventBus.on('first-event', function(msg) {alert(`訂閱的消息是:${msg}`);}); }// 發(fā)送消息 function emit() {const msgInput = document.getElementById("msgInputId")EventBus.emit('first-event', msgInput.value) }// 移除消息 function off(msgName) {EventBus.off(msgName) }

    CodePen預(yù)覽

    CodePen預(yù)覽

    -----可能需要翻墻-----

    <p data-height="265" data-theme-id="0" data-slug-hash="maQpgR" data-default-tab="js,result" data-user="beyondverage0908" data-pen-title="EventBus的實(shí)現(xiàn)" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" class="codepen"><span>See the Pen EventBus的實(shí)現(xiàn) by avg (@beyondverage0908) on CodePen.</span></p>
    <script async src="https://static.codepen.io/ass...;></script>

    總結(jié)

    整個(gè)EventBus主要部分是分為三個(gè)部分。消息中心,訂閱事件方法,發(fā)布消息方法。雖然不能和Vue中實(shí)現(xiàn)的那么全面,但麻雀雖小,五臟俱全。缺少的部分在于對(duì)數(shù)據(jù)安全性的校驗(yàn)。希望給你一個(gè)實(shí)現(xiàn)的思路

    總結(jié)

    以上是生活随笔為你收集整理的EventBus的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。