摘要:看这篇之前,如果没有看过之前的文章,可拉到文章末尾查看之前的文章。回顾在上一步我们实现了一个简易的事件管理的类,接下来我们把它给优化下,方便我们的使用。接着我们来优化。
看这篇之前,如果没有看过之前的文章,可拉到文章末尾查看之前的文章。
回顾在上一步我们实现了一个简易的事件管理的类,接下来我们把它给优化下,方便我们的使用。主要优化内容:
方便为多个事件添加同一个函数
方便为一个事件添加多个函数
有针对性的取消事件的函数
第一点和第二点都要修改 $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 & 总结
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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 对象,还没有看过之前代码的同学,请确认看过之前的文章。 主要实现内...
阅读 2778·2023-04-26 01:47
阅读 3591·2023-04-25 23:45
阅读 2460·2021-10-13 09:39
阅读 605·2021-10-09 09:44
阅读 1788·2021-09-22 15:59
阅读 2761·2021-09-13 10:33
阅读 1706·2021-09-03 10:30
阅读 655·2019-08-30 15:53