目标
使用 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 对象 .valuereturn (target[key].value = value);} else {return Reflect.set(target, key, value);}},});}
