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(); |