JavaScript利用發(fā)布訂閱模式編寫事件監(jiān)聽函數(shù)
背景
大家有沒有遇到過這種情況,想要寫一個事件監(jiān)聽函數(shù),當(dāng)某個事件被觸發(fā)的時候,會自動執(zhí)行這個監(jiān)聽函數(shù),類似:
on('changeText', (data) => { console.log(data) })
這就是典型的發(fā)布訂閱的一個模式。對于大型項目,你可以使用類似 redux/vuex 這樣的響應(yīng)式狀態(tài)管理系統(tǒng),但是如果你不想使用這么重的方案,可以使用 eventHub。
eventHub和發(fā)布訂閱模式(Pub/Sub)的關(guān)系?
發(fā)布訂閱是一種設(shè)計模式,EventHub可以被看作是一種Pub/Sub實現(xiàn)。
示例
class EventHub { constructor() { this.listeners = {}; } on(eventName, callback) { if (!this.listeners[eventName]) { this.listeners[eventName] = []; } this.listeners[eventName].push(callback); } emit(eventName, data) { if (this.listeners[eventName]) { this.listeners[eventName].forEach(callback => { callback(data); }); } } }
const eventHub = new EventHub(); eventHub.on('hello', (data) => { console.log(`Hello ${data}!`); }); eventHub.emit('hello', 'world');
上述代碼定義了一個名為EventHub的類,它有兩個方法:
- on方法用于訂閱事件
- emit方法用于發(fā)布事件。
在實際應(yīng)用中,我們可能需要更復(fù)雜的功能,例如取消訂閱事件或限制監(jiān)聽器的數(shù)量。
基于Vue的eventHub
vue 原生提供了 $on、$emit 等函數(shù),所以直接就可以這么用,但是好像 vue3 去掉了,可以使用更靈活的 ref、reactive
let eventHub = new Vue() // 監(jiān)聽 eventHub.$on('eventName', (data) => { console.log('Trigger this event and receive ' + data) }) // 廣播 eventHub.$emit('eventName', data) // 去掉監(jiān)聽 eventHub.$off('eventName')
到此這篇關(guān)于JavaScript利用發(fā)布訂閱模式編寫事件監(jiān)聽函數(shù)的文章就介紹到這了,更多相關(guān)JavaScript事件監(jiān)聽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 為radio類型的INPUT添加客戶端腳本(附加實現(xiàn)JS來禁用onClick事件思路代碼)
- 怎么通過onclick事件獲取js函數(shù)返回值(代碼少)
- javascript 動態(tài)改變onclick事件觸發(fā)函數(shù)代碼
- 詳解js的事件處理函數(shù)和動態(tài)創(chuàng)建html標(biāo)記方法
- ES6中javascript實現(xiàn)函數(shù)綁定及類的事件綁定功能詳解
- JavaScript觸發(fā)onScroll事件的函數(shù)節(jié)流詳解
- 深入理解Node.js 事件循環(huán)和回調(diào)函數(shù)
- 實例講解javascript注冊事件處理函數(shù)
- js動態(tài)添加input按鈕并給按鈕增加onclick的函數(shù)事件(帶參數(shù))完整實例
相關(guān)文章
純JS實現(xiàn)的讀取excel文件內(nèi)容功能示例【支持所有瀏覽器】
這篇文章主要介紹了純JS實現(xiàn)的讀取excel文件內(nèi)容功能,結(jié)合實例形式分析了基于js相關(guān)插件進(jìn)行Excel文件讀取的相關(guān)操作技巧,需要的朋友可以參考下2018-06-06Bootstrap carousel輪轉(zhuǎn)圖的使用實例詳解
圖片輪播效果在Web中常常能看到,很多人也稱之為幻燈片。這篇文章主要給大家介紹Bootstrap carousel輪轉(zhuǎn)圖的使用實例詳解,需要的朋友可以參考下2016-05-05基于原生JavaScript實現(xiàn)SPA單頁應(yīng)用
單頁Web應(yīng)用?(single?page?web?application,SPA)?,就是只有一張Web頁面的應(yīng)用,是加載單個HTML?頁面并在用戶與應(yīng)用程序交互時動態(tài)更新該頁面的Web應(yīng)用程序。本文將利用原生JS實現(xiàn)SPA單頁應(yīng)用,需要的可以參考一下2023-03-03