• vue3中实现响应式原理Proxy 和 Reflect。代码演示


    实现原理:
    通过 Proxy(代理):拦截对象中任意属性的变化(包括读写,属性的添加,删除等)。
    通过 Reflect(反射):对被代理的对象(也就是源对象)属性进行操作。

    eg:1
    let person = {
          name: "你好",
          age: 18,
        };
        
    // 模拟vue3中实现响应式
    const p = new Proxy(person, {
      // 读取属性时可调用
      get(target, propName) {
        console.log(`我读取了p身上的${propName}属性`);
        return target[propName];
      },
      // 有人修改或者追加某个属性时调用(新增、修改)
      set(target, propName, value) {
        console.log(`我修改了p身上的${propName}属性,去更新界面`);
        target[propName] = value;
      },
      // 有人删除某个属性时调用
      deleteProperty(target, propName) {
        console.log(`我删除了p身上的${propName}属性,去更新界面`);
        return delete target[propName];
      },
    });
    
    
    eg2:
     let obj = {
          a: 1,
          b: 2,
        };
    // 通过 Reflect.defineProperty 反射对象 去操作
    // 这里的Reflect 是有返回值的,
    // 如果你重复定义了某个属性,那么就会返回 false,不过是页面不会报错,
    let x1 = Reflect.defineProperty(obj, "c", {
      get() {
        return 3;
      },
    });
    console.log(x1);
    let x2 = Reflect.defineProperty(obj, "c", {
      get() {
        return 4;
      },
    });
    console.log(x2);
    if (x2) {
      console.log("执行xxx操作成功");
    } else {
      console.log("执行xxx操作失败");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    通过上述两个例子 ,可以总结出真正的实现原理 :

        const p = new Proxy(person, {
          // 读取属性时可调用
          get(target, propName) {
            console.log(`我读取了p身上的${propName}属性`); 
            return Reflect.get(target, propName);
          },
          // 有人修改或者追加某个属性时调用(新增、修改)
          set(target, propName, value) {
            console.log(`我修改了p身上的${propName}属性,去更新界面`); 
            Reflect.set(target, propName, value);
          },
          // 有人删除某个属性时调用
          deleteProperty(target, propName) {
            console.log(`我删除了p身上的${propName}属性,去更新界面`); 
            return Reflect.defineProperty(target, propName);
          },
        });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    猿创征文|测试前辈给测试小白的软件测试九条原则
    一种NR无线小站的同步设计与实现
    Actor对象的引用 怎么设置他的材质?或设置是否启用重力?
    十一、指针
    CAS解析
    i711800h和i710875h性能差多少
    考研数学|汤家凤《1800》vs 张宇《1000》怎么选?
    WeNet更新:喜马拉雅团队在 WeNet 中支持 Squeezeformer
    React HOOK 自定义拍照画面,自动截取指定画面
    for forin forof forEach map区别
  • 原文地址:https://blog.csdn.net/lzfengquan/article/details/128185269