Skip to content

响应式原理

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的源码中,都是用了这种函数。