摘要:事件棧獲取事件對應棧的索引事件類型對應棧的索引不存在為已有事件類型處理棧監(jiān)聽事件自定義事件類型事件處理函數(shù)已存在事件類型處理直接把相應的處理函數(shù)入棧不存在事件,把對應的事件處理入棧觸發(fā)對應的事件自定義事件類型參數(shù)對象執(zhí)行對應的事件自定義
export default class { // 事件棧 eventStacks = [{ eventType: "", handlers: [] }]; /** * 獲取事件對應棧的索引 * * @param {string} eventType 事件類型 * @return {number} stackIndex 對應棧的索引 不存在為-1 */ indexOf(eventType) { const eventStacks = this.eventStacks; // 已有事件類型處理棧 let stackIndex = -1; for (let i = 0; i < eventStacks.length; i++) { const eventStack = eventStacks[i]; if (eventStack.eventType === eventType) { stackIndex = i; break; } } return stackIndex; }; /** * 監(jiān)聽事件 * * @param {string} eventType 自定義事件類型 * @param {Function} handler 事件處理函數(shù) */ on(eventType, handler) { const index = this.indexOf(eventType); if (index >= 0) { // 已存在事件類型處理 直接把相應的處理函數(shù)入棧 this.eventStacks[index].handlers.push(handler); } else { // 不存在事件,把對應的事件處理入棧 const newEventStack = { eventType, handlers: [handler] }; this.eventStacks.push(newEventStack); } }; /** * 觸發(fā)對應的事件 * * @param {string} eventType 自定義事件類型 * @param {Object} params 參數(shù)對象 */ emit(eventType, params = {}) { this.execEvent(eventType, params); }; /** * 執(zhí)行對應的事件 * * @param {string} eventType 自定義事件類型 * @param {Object} params 參數(shù)對象 */ execEvent(eventType, params = {}) { const index = this.indexOf(eventType); if (index < 0) { return; } const handlers = this.eventStacks[index].handlers; for (let i = 0; i < handlers.length; i++) { const currentHandler = handlers[i]; if (currentHandler && typeof currentHandler === "function") { currentHandler(params); } } }; /** * 解除對應的事件 * * @param {string} eventType 事件類型 * @param {Function} handler 事件處理器 必須是引用傳進來 使用對象引用相等判斷 */ offHandler(eventType, handler) { const index = this.indexOf(eventType); if (index >= 0 && this.eventStacks[index].handlers.length) { // 存在,并且已經入棧 const handlers = this.eventStacks[index].handlers; this.eventStacks[index].handlers = handlers.filter(currentHandler => { return currentHandler !== handler }); } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105511.html
摘要:掛載到添加文件第一個參數(shù)是事件對象,第二個參數(shù)是接收到消息信息,可以是任意類型事件訂閱監(jiān)聽當前實例上的自定義事件。取消事件訂閱,移除自定義事件監(jiān)聽器。 EventBus EventBus是一種發(fā)布/訂閱事件設計模式的實踐。在vue中適用于跨組件簡單通信,不適應用于復雜場景多組件高頻率通信,類似購物車等場景狀態(tài)管理建議采用vuex。 掛載EventBus到vue.prototype 添加...
摘要:消息處理的方法也只能限定于和,分別代表四種線程模型。如果使用事件處理函數(shù)指定了線程模型為,那么無論事件在哪個線程發(fā)布,該事件處理函數(shù)都會在新建的子線程中執(zhí)行。分別使用上面四個方法訂閱同一事件,打印他們運行所在的線程。 前言:EventBus出來已經有一段時間了,github上面也有很多開源項目中使用了EventBus。所以抽空學習順便整理了一下。目前EventBus最新版本是3.0,所...
閱讀 3707·2021-10-18 13:34
閱讀 2396·2021-08-11 11:15
閱讀 1201·2019-08-30 15:44
閱讀 687·2019-08-26 10:32
閱讀 985·2019-08-26 10:13
閱讀 2065·2019-08-23 18:36
閱讀 1774·2019-08-23 18:35
閱讀 523·2019-08-23 17:10