VUE3.0-对比VUE2.X和VUE3.0的响应式

1.VUE3.0的响应式

  • 通过Proxy(代理): 拦截对data任意属性的任意(13种)操作, 包括属性值的读写, 属性的添加, 属性的删除等…
  • 通过 Reflect(反射): 动态对被代理对象的相应属性进行特定的操作
    let obj = {
      name: '张三',
      age: 26,
      wife: {
        name: '李四',
        age: 25
      }
    };
    /*
    * 把目标对象变成代理对象 
    * 参数:
    *   参数一:obj=>需要代理的目标对象 
    *   参数二:handler=>处理器对象,用来监视数据及数据的操作
    */
    let proxyObj = new Proxy(obj, {
      
      /*
      * 修改目标对象的属性值为目标对象添加的新属性
      * 参数:
      *   参数一:obj=>需要代理的目标对象 
      *   参数二:prop=>需要设置值的key
      *   参数三:value=>需要设置的值的value
      */

      set(obj, prop, value) {//
        console.log('set方法调用了', obj, prop, value);
        return Reflect.set(obj, prop, value);
      },
      /*
      * 获取目标对象的某个属性值 
      * 参数:
      *   参数一:obj=>需要代理的目标对象 
      *   参数二:prop=>需要获取值的key
      */

      get(obj, prop) {
        console.log('get方法调用了', obj, prop);
        return Reflect.get(obj, prop);
      },
      /**
      * 删除目标对象上的某个属性
      * 参数:
      *   参数一:obj=>需要代理的目标对象 
      *   参数二:prop=>需要删除值的key
      */
      deleteProperty(obj, prop) {
        console.log('deleteProperty方法调用了', obj, prop);
        return Reflect.deleteProperty(obj, prop);
      }
    });

    proxyObj.name = '996';//改
    console.log(proxyObj.name);//查
    delete proxyObj.age;//删
    console.log(obj);
    proxyObj.wife.sex = '女';//增
    console.log(obj);

2.VUE2.X实现响应式

  • 对象: 通过defineProperty对对象的已有属性值的读取和修改进行劫持(监视/拦截)
  • 数组: 通过重写数组更新数组一系列更新元素的方法来实现元素修改的劫持
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>

  </style>
</head>

<body>
  <input type="text">
  <span></span>
  <script>

    let obj = { name: 'zhangsan' };//初始数据
    let newObj = JSON.parse(JSON.stringify(obj));//深拷贝数据
    Object.defineProperty(obj, 'name', {
      set(value) {
        if (value !== obj.name) {
          newObj.name = value;
          observe();
        }
      },
      get() {
        return newObj.name
      }
    });

    function observe() {
      document.querySelector('span').innerText = obj.name;
      document.querySelector('input').value = obj.name;
    }
    observe();
    document.querySelector('input').addEventListener('input', function () {
      obj.name = this.value
    }, false)
  </script>
</body>
上一篇:VUE2 可视化使用 element-ui 组件库


下一篇:vue学习记录(十) --- vue3.0学习