在上一篇中简单的实现了Vue 响应式的依赖收集和触发,详情点击 learn-vue-01
但我们只是将依赖放在一个数组里面,虽然好理解但却不好维护,本节我们来实现一个可维护依赖的类。
确定功能
类的属性:
target: 函数,存放需要添加的依赖
实例的属性及方法:
subs:Array,存放依赖
addSub:Function,添加依赖
removeSub:Function,删除依赖
notify:Function,执行依赖
实现
封装 Dep
类,进行依赖维护。
1 | class Dep { |
对上篇中的 defineReactive
进行改进:
1 | const defineReactive = function (obj, key, val) { |
调用 defineReactive
函数:
1 | const obj = {} |
上面的代码还是存在两个问题:
- 虽然对添加依赖和处理依赖进行了解耦,但还是不完全的解耦,在执行依赖仍需传入新值和旧值。
- 可以看到我们并没有去使用
removeSub
方法去移除依赖,因为移除依赖一般都是在外部执行了,但我们目前是将Dep
的实例放在defineReactive
内部,所以外部还是不能移除已经没有用的依赖。
要解决上面两个问题,需要使用 Vue
中的 Watch
类处理,这个之后再说。