1.VUE3.0的响应式通过Proxy(代理): 拦截对data任意属性的任意(13种)操作, 包括属性值的读写, 属性的添加, 属性的删除等…通过 Reflect(反射): 动态对被代理对象的相应属性进行特定的操作let obj = {name: 张三,ag...
                
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>
				 沃梦达教程
				
			本文标题为:VUE3.0-对比VUE2.X和VUE3.0的响应式
				
        
 
            
        基础教程推荐
             猜你喜欢
        
	     - 浅谈Vue2和Vue3的数据响应 2023-10-08
 - js禁止页面刷新与后退的方法 2024-01-08
 - 浅析canvas元素的html尺寸和css尺寸对元素视觉的影响 2024-04-26
 - vue离线环境如何安装脚手架vue-cli 2025-01-19
 - Ajax实现动态加载数据 2023-02-01
 - JS前端广告拦截实现原理解析 2024-04-22
 - CSS3的几个标签速记(推荐) 2024-04-07
 - 基于Vue制作组织架构树组件 2024-04-08
 - this[] 指的是什么内容 讨论 2023-11-30
 - 关于文字内容过长,导致文本内容超出html 标签宽度的解决方法之自动换行 2023-10-28
 
    	
    	
    	
    	
    	
    	
    	
    	
						
						
						
						
						
				
				
				
				