响应式原理
vue3使用Proxy中的get set来拦截读取赋值的操作做收集依赖tracker和更新依赖trigger
使用effect副作用函数来绑定dom跟数据
在外层组装了一个weakMap结构用来存放依赖
ts
weakMap<target,Map<targetKey,Set<Effect>>>
在tracker函数中来组装这个数据结构,weakMap的key是当前对象,value是一个Map结构
Map结构中的key是当前正在使用的对象的key,值是一个Set,Set就是副作用函数
那更新依赖就能拿到这个weakMap结构,执行这个副作用函数就可以更新
ref:如果是对象,调用reactive,内部声明一个类有get value set value,然后通过tracker和trigger收集依赖更新依赖
proxy
Proxy 是一个类,接受两个个参数,第一个参数target,第二个参数是一个对象
第二个参数中有很多API:get、set、apply、deleteProperty等等13个API
weakMap
为啥使用weakmap :鱿鱼西考虑到了用户会手动释放变量的情况
想要理解 WeakMap,首先需要了解垃圾回收机制(GC),标记清除算法。
当一个变量所有的引用全部被释放,此变量才会被回收。
key只能是对象 弱引用 不能遍历 垃圾回收有200-300ms间隔
js
const a = {name: '1'};
const b = a;
console.log(b); // {name: '1'} 因为 b 仍然引用它
js
let wm = new WeakMap();
let obj = { name: 'Alice' };
wm.set(obj, 'some metadata');
// 删除对 obj 的强引用
obj = null;
console.log(wm.get(obj)); // undefined
// 此时,原对象可以被垃圾回收。
// WeakMap 中的键是“弱引用”,不会阻止对象被回收。
什么是副作用函数,什么是纯函数
纯函数:函数的的行为是可预测的,相同的输入永远会得到相同的输出,不会修改外部的状态,也不依赖外部状态。副作用函数则相反。
副作用函数并不是贬义,像react的useEffect,vue的源码中,都是用了这种函数。