vue3源码学习-6-调度器
前言
经过第 5 章对于分支切换的操作之后,vue 的 effect 源码就具有了收集需要的依赖,对于改变不必要的数据,不会触发依赖的更新。那么今天就要实现 vue3 的调度器代码,之前 effect 只能同步运行代码,无法对于异步操作进行数据更新。
官方的写法是什么样子呢?
1 | let flag = false; |
上面的代码最后只会渲染 stage.age=5000 这个样子。并且还具有了可以手动停止依赖的触发的操作stop()
编写 stop()函数
首先,先完成能手动停止依赖的和触发。那么我就要有一个 stop 函数来完成关闭操作,之前通过 run 里面的函数渲染,使得属性触发了 get 操作。通过 get 函数里面编写的 track 函数,完成了依赖收集。然后通过 trigger 里面的依赖记录重新触发函数。在第 5 篇文章中,完成了依赖每次先清空再收集的函数,那么 stop 不就可以直接通过调用清空依赖,来达到停止触发的操作。同时把 active 设置为 false,来关闭函数的更新。所以 stop 函数如下编写了。
1 | class ReactiveEffect{ |
同样的 effect 函数也要做相应的修改,抛出当前的 runner 对象,然后通过这个对象上的 stop 来操作停止命令。
1 | export function effect(fn, options: any = {}) { |
这样就可以在拿到 effect 到返回函数之后,通过runner.effect.stop()
来手动停止执行。
schedule 调度函数实现
当用户在 effect 中的 schedule 中写了一个自己的一个操作,那么就能通过用户是否写了 schedule 函数来判断是否要执行用户的 schedule,还是执行 run()。
了解了大致思路,我们先修改 effect 函数,增加一个对象,通过对象来传递用户编写的函数
1 | export function effect(fn, options: any = {}) { |
同时 ReactiveEffect 类上在构造函数上加入 schedule 参数。
1 | class ReactiveEffect{ |
下一步就是修改 trigger 函数,这样变量的属性改变的时候就知道是不是执行 schedule 函数了
1 | export function trigger(target, type, key, value, oldValue) { |
到此为止,就能在测试 html 上调用自己写的 schedule 函数了,如开篇中的例子
1 | git:[@github/MicroMatrixOrg/vue3-plan/tree/effect_schedule] |