响应式 - ref
ref
接收一个可选的value
做为入参,接着直接调用createRef
createRef
先判断value
是否已经是一个ref
, 如果是则直接返回,如果不是接着判断是不是浅观察,如果是浅观察直接构造一个ref
返回,不是则将rawValue
转换成reactive
再构造一个ref
返回读取
ref
的值时,触发get
方法,进行依赖收集;设置ref
的值时,触发set
方法,触发依赖的函数
// Jest
it("作为值", () => {
const a = ref(1); // 创建一个响应式的值
let dummy;
let calls = 0;
// 收集依赖
// 此时会自动运行一遍当前函数,运行当前函数 fn 遇到 a 时会触发 a 的 get 方法,并将当前依赖收集到 ref 的 dep 中
effect(() => {
// fn
calls++;
dummy = a.value;
});
expect(calls).toBe(1); // ✅
expect(dummy).toBe(1); // ✅
// 改变 a 的值时,会触发 a 的 set 方法,并去执行依赖 dep 中的函数 fn
a.value = 2; // 1 + 1 = 2
expect(calls).toBe(2); // ✅
expect(dummy).toBe(2); // ✅
});
it("作为对象", () => {
const a = ref({
count: 1,
});
let dummy;
effect(() => {
dummy = a.value.count;
});
expect(dummy).toBe(1); // ✅
a.value.count = 2; // 1 + 1 = 2
expect(dummy).toBe(2); // ✅
});