目标
使用 proxyRefs 后,可以省略 ref 中的 .value,Vue3 中 template 就调用到这个功能
it('proxyRefs', () => {
const user = {
age: ref(10),
name: 'xiaohong',
};
const proxyUser = proxyRefs(user);
expect(user.age.value).toBe(10);
expect(proxyUser.age).toBe(10);
expect(proxyUser.name).toBe('xiaohong');
proxyUser.age = 20;
expect(proxyUser.age).toBe(20);
expect(user.age.value).toBe(20);
proxyUser.age = ref(10);
expect(proxyUser.age).toBe(10);
expect(user.age.value).toBe(10);
});
实现
export function proxyRefs(objectWithRefs) {
return new Proxy(objectWithRefs, {
get(target, key) {
return unRef(Reflect.get(target, key));
},
set(target, key, value) {
// target[key] 之前的值是 ref 对象,更新的值不是 ref 对象
if (isRef(target[key]) && !isRef(value)) {
// 把更新值赋于 ref 对象 .value
return (target[key].value = value);
} else {
return Reflect.set(target, key, value);
}
},
});
}