摘要:看這篇之前,如果沒有看過之前的文章,可拉到文章末尾查看之前的文章。回顧在上一步我們實現了一個簡易的事件管理的類,接下來我們把它給優化下,方便我們的使用。接著我們來優化。
看這篇之前,如果沒有看過之前的文章,可拉到文章末尾查看之前的文章。
回顧在上一步我們實現了一個簡易的事件管理的類,接下來我們把它給優化下,方便我們的使用。主要優化內容:
方便為多個事件添加同一個函數
方便為一個事件添加多個函數
有針對性的取消事件的函數
第一點和第二點都要修改 $on 函數,所以我們一起改:
之前的代碼
$on(eventName, fn) { let ctx = this; if(!ctx._events[eventName]){ ctx._events[eventName] = [] } ctx._events[eventName].push(fn) return ctx }
優化之后的代碼
$on(eventName, fn) { let ctx = this // 處理事件名是數組的情況 if (Array.isArray(eventName)) { // 遞歸調用 $on 函數 eventName.forEach(name => this.$on(name, fn)) } else { // 處理處理函數為數組的情況 // 將處理函數統一成數組方便添加 if (!Array.isArray(fn)) { fn = [fn] } if(!ctx._events[eventName]){ ctx._events[eventName] = [] } ctx._events[eventName].push(fn) } return ctx }
很簡單的優化,但卻讓 $on 函數更加方便的使用。
接著我們來優化 $off 。我們先看看之前的代碼:
$off(eventName) { let ctx = this const cbs = ctx._events[eventName] if (cbs) { // 取消置空即可 ctx._events[eventName] = null } return ctx }
我們只做了清空特定事件,其實我們能做的還有很多,
清空所有事件
清空多個事件
取消特定事件的特定處理函數
優化的細節看代碼中的注釋
$off(eventName, fn) { let ctx = this // 清空所有事件 if (!arguments.length) { ctx._events = Object.create(null) return ctx } // 清空多個事件 if (Array.isArray(eventName)) { eventName.forEach(name => this.$off(name, fn)) return ctx } // 若沒有事件對應的函數列表則不用處理 const cbs = ctx._events[eventName] if (!cbs) { return ctx } // 清空特定事件 if (!fn) { ctx._events[eventName] = null return ctx } // 取消特定事件的特定處理函數 if (fn) { let cb let i = cbs.length // 處理一次取消多個的情況 if (Array.isArray(fn)) { fn.forEach(fnc => this.$off(eventName, fnc)) } while (i--) { cb = cbs[i] if (cb === fn || cb.fn === fn) { cbs.splice(i, 1) break } } } return ctx }
ok 優化好了,測試一下:
import {Event} from "./Event"; let eventTest = new Event() eventTest.$on("eventName1", (e) => { console.log("一次添加一個處理函數") console.log(e) }) eventTest.$on("eventName2", [(e) => { console.log("一次添加多個處理函數,第一個") console.log(e) }, (e) => { console.log("一次添加多個處理函數,第二個") console.log(e) }]) eventTest.$on(["eventName3", "eventName4"], (e) => { console.log("多個事件添加同一處理函數") console.log(e) }) eventTest.$on(["eventName5", "eventName6"], [(e) => { console.log("多個事件添加多個處理函數,第一個") console.log(e) }, (e) => { console.log("多個事件添加多個處理函數,第二個") console.log(e) }]) eventTest.$emit("eventName1", "傳入參數1") // 一次添加一個處理函數 // 傳入參數1 eventTest.$emit("eventName2", "傳入參數2") // 一次添加多個處理函數,第一個 // 傳入參數2 // 一次添加多個處理函數,第二個 // 傳入參數2 eventTest.$emit("eventName3", "傳入參數3") // 多個事件添加同一處理函數 // 傳入參數3 eventTest.$emit("eventName4", "傳入參數4") // 多個事件添加同一處理函數 // 傳入參數4 eventTest.$emit("eventName5", "傳入參數5") // 多個事件添加多個處理函數,第一個 // 傳入參數5 // 多個事件添加多個處理函數,第二個 // 傳入參數5 eventTest.$emit("eventName6", "傳入參數6") // 多個事件添加多個處理函數,第一個 // 傳入參數6 // 多個事件添加多個處理函數,第二個 // 傳入參數6 console.log("------------------------------") eventTest.$off("eventName1") eventTest.$off(["eventName2", "eventName3"]) eventTest.$emit("eventName1", "傳入參數1") // 無輸出 eventTest.$emit("eventName2", "傳入參數2") // 無輸出 eventTest.$emit("eventName3", "傳入參數3") // 無輸出 eventTest.$emit("eventName4", "傳入參數4") // 多個事件添加同一處理函數 // 傳入參數4 eventTest.$emit("eventName5", "傳入參數5") // 多個事件添加多個處理函數,第一個 // 傳入參數5 // 多個事件添加多個處理函數,第二個 // 傳入參數5 eventTest.$emit("eventName6", "傳入參數6") // 多個事件添加多個處理函數,第一個 // 傳入參數6 // 多個事件添加多個處理函數,第二個 // 傳入參數6 console.log("------------------------------") eventTest.$off() eventTest.$emit("eventName1", "傳入參數1") // 無輸出 eventTest.$emit("eventName2", "傳入參數2") // 無輸出 eventTest.$emit("eventName3", "傳入參數3") // 無輸出 eventTest.$emit("eventName4", "傳入參數4") // 無輸出 eventTest.$emit("eventName5", "傳入參數5") // 無輸出 eventTest.$emit("eventName6", "傳入參數6") // 無輸出 console.log("------------------------------")
這兩節吧,事件介紹了下,一個健壯的事件的類也編寫好了,接下來我們把這 8 步實現的內容集合到一個對象下,也就是 Vue 下,敬請期待。
點擊查看相關代碼
系列文章地址VUE - MVVM - part1 - defineProperty
VUE - MVVM - part2 - Dep
VUE - MVVM - part3 - Watcher
VUE - MVVM - part4 - 優化Watcher
VUE - MVVM - part5 - Observe
VUE - MVVM - part6 - Array
VUE - MVVM - part7 - Event
VUE - MVVM - part8 - 優化Event
VUE - MVVM - part9 - Vue
VUE - MVVM - part10 - Computed
VUE - MVVM - part11 - Extend
VUE - MVVM - part12 - props
VUE - MVVM - part13 - inject & 總結
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94578.html
摘要:事件是什么在標準瀏覽器中,我們經常使用來為一個添加一個事件等。仔細看這些情況,歸結到代碼中,無非就是一個行為或情況的名稱,和一些列的動作,而在中動作就是,一系列的動作就是一個函數的集合。 看這篇之前,如果沒有看過之前的文章,可拉到文章末尾查看之前的文章。 事件是什么? 在標準瀏覽器中,我們經常使用:addEventListener 來為一個 DOM 添加一個事件(click、mouse...
摘要:在中關于如何實現在網上可以搜出不少,在看了部分源碼后,梳理一下內容。換個說法,當我們取值的時候,函數自動幫我們添加了針對當前值的依賴,當這個值發生變化的時候,處理了這些依賴,比如說節點的變化。 在 VUE 中關于如何實現在網上可以搜出不少,在看了部分源碼后,梳理一下內容。 首先,我們需要了解一下 js 中的一個 API :Object.defineProperty(obj, prop,...
摘要:通過裝作這些變化,我們實現了從而到達了數據變化觸發函數的過程。于此同時,我們還實現了來擴展這個可響應的結構,讓這個對象擁有了觸發和響應事件的能力。最后,根據我們的實現,這是最終的產出,一個框架,了解一下系列文章地址優化優化總結 看這篇之前,如果沒有看過之前的文章,移步拉到文章末尾查看之前的文章。 provide / inject 在上一步我們實現了,父子組件,和 props 一樣 pr...
摘要:看這篇之前,如果沒看過先移步看實現中。同樣的,在取值時收集依賴,在設置值當值發生變化時觸發依賴。中實現了一個的類來處理以上兩個問題,之后再說。以下語法下的,源碼中差不多就這樣點擊查看相關代碼系列文章地址優化優化總結 看這篇之前,如果沒看過 step1 先移步看 實現 VUE 中 MVVM - step1 - defineProperty。 在上一篇我們大概實現了,Vue 中的依賴收集和...
摘要:調用父類的方法類在我們上一步已經實現。我們先實現的綁定,因為是要被監聽,所以要進行進一步的處理。調用父類的方法方法綁定完事,其實就這么簡單。 看這篇之前,如果沒有看過之前的文章,可拉到文章末尾查看之前的文章。 前言 激動人心的時候即將來臨,之前我們做的 8 步,其實都在為這一步打基礎,這一步,我們來簡單實現一個 Vue 對象,還沒有看過之前代碼的同學,請確認看過之前的文章。 主要實現內...
閱讀 2779·2023-04-26 01:47
閱讀 3591·2023-04-25 23:45
閱讀 2461·2021-10-13 09:39
閱讀 606·2021-10-09 09:44
閱讀 1789·2021-09-22 15:59
閱讀 2761·2021-09-13 10:33
閱讀 1706·2021-09-03 10:30
閱讀 656·2019-08-30 15:53