目标

使用 proxyRefs 后,可以省略 ref 中的 .value,Vue3 中 template 就调用到这个功能

  1. it('proxyRefs', () => {
  2. const user = {
  3. age: ref(10),
  4. name: 'xiaohong',
  5. };
  6. const proxyUser = proxyRefs(user);
  7. expect(user.age.value).toBe(10);
  8. expect(proxyUser.age).toBe(10);
  9. expect(proxyUser.name).toBe('xiaohong');
  10. proxyUser.age = 20;
  11. expect(proxyUser.age).toBe(20);
  12. expect(user.age.value).toBe(20);
  13. proxyUser.age = ref(10);
  14. expect(proxyUser.age).toBe(10);
  15. expect(user.age.value).toBe(10);
  16. });

实现

  1. export function proxyRefs(objectWithRefs) {
  2. return new Proxy(objectWithRefs, {
  3. get(target, key) {
  4. return unRef(Reflect.get(target, key));
  5. },
  6. set(target, key, value) {
  7. // target[key] 之前的值是 ref 对象,更新的值不是 ref 对象
  8. if (isRef(target[key]) && !isRef(value)) {
  9. // 把更新值赋于 ref 对象 .value
  10. return (target[key].value = value);
  11. } else {
  12. return Reflect.set(target, key, value);
  13. }
  14. },
  15. });
  16. }