vue3.0 源码学习-reactive
最近在寻在学习方向,然后就想学习源码,看看能理解多少,算是个尝试,clone 了 vue3 的库,然后结合一些视频和网上的教程,尝试去理解 vue3 的源码思路,于是就拥有了下面这篇学习笔记,vue3.0 源码学习-reactive 篇。
目标
reactive
初始化数据时发生了什么effect
副作用是怎么更新的
creative
初始化数据
let data = reactive(obj)
时发生了什么,其实这个网上很多的教程说明了,就是一个用proxy
代理拦截了get
和set
操作,初始化的过程重点是在get
和set
中的收集依赖和触发更新机制。
结合 vue3 的
reacrive
源码路径packages/reactivity/src/reactive.ts
去看初始化的代码流程。
get
收集依赖
依赖收集的函数在packages/reactivity/src/effect.ts
中的track
函数中实现,具体可点击源码路径链接跳转查看。
其实重点是实现依赖收集的方法,理解它是怎么存储依赖,其存储的数据格式是怎么样的,后期触发set
的时候如何利用收集的依赖触发更新机制,所以以下是我自己对照一些教程自己敲了一遍简化版本track
函数的实现:
1 | const targetMap = new WeakMap(); // 依赖存储 |
当中
activeEffect
是需要关联上副作用effect
的实现的,后面会整体关联起来总结一遍流程。
set
触发更新
初始化中我们在get
收集好的依赖(activeEffect
副作用)在我们set
的时候回去找到对应的依赖(副作用)触发更新。
理解起来就是,我们在更新一些双向绑定的数据的时候,会动态的触发视图的更新,或者一些函数的执行,就像我们一直用的计算属性和侦听器
computed
和watch
,它们就是利用更新副作用原理来实现的。
set
的更新函数源码是在packages/reactivity/src/effect.ts
中的trigger
函数,具体可点击源码路径链接跳转查看
同样的,看源码好像很复杂,然后我也是结合网上的一些教程,自己敲了个简化版的trigger
来主要看下它怎么获取依赖执行更新
1 | /** |
最后的
effects.forEach(run)
循环去触发更新是配合上get
中收集依赖(副作用effect
),最后会串联一起总结一遍。
最后是串联get
和set
的依赖收集和触发更新的副作用effect
,它的创建函数源码在packages/reactivity/src/effect.ts
中的createReactiveEffect
函数,具体可点击源码路径链接跳转查看
以下是简化版的实现
1 | let effectStack = []; // 栈操作 |
总结
整体get
、set
和effect
的关系,这里将在我实现的简化版的代码中整理流程思路。以下是配合流程梳理的简化版reactive
代码
1 | const reactiveMap = new WeakMap(); |