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