探讨Vue 数据监测原理-第一节-引入Vue 中一些简单介绍

探讨一下Vue 数据监测的原理

尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通
Vue 教程 https://cn.vuejs.org/v2/guide/
MDN Web Docs 社区 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object

本次探讨共的第一个章节

第一节: 引入Vue 中一些简单介绍

主要简单的介绍一下 Vue 中的 data 、_data、 数据代理;
在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名表示 Vue 实例。

1. data

  • data :类型是Object|Function 但是此处只探讨 data 类型为 Object
1.1. Vue实例的数据对象
  • Vue实例的数据对象:创建普通的Vue实例,data是Vue实例的数据对象
      var data = { a: 1 }
       // 直接创建一个实例
       var vm = new Vue({
    	    data: data
       })
       vm.a // => 1
       vm.$data === data // => true
    
  • 实例创建之后,可以通过 vm.$data 访问原始数据对象。Vue 实例也代理了 data对象上所有的 property,因此访问 vm.a 等价于访问 vm.$data.a
  • Vue 会递归地把 dataproperty 转换为 getter/setter,从而让 dataproperty 能够响应数据变化
     const vm = new Vue({ 
        el: "#root",
        data: {                  // 可以直观的看到,在Vue 实例里面,data其实就是一个对象,里面
           name: "安锐捷",       // 定义的数据都是以键值对形式体现出来的
           address: "普天科技园"    
        }
      })
    

2. 存储data 数据 : _data

2.1. vm._data == option.data == data
  • 其实就是vm._data 它是用来存储data 数据使用的,此处有一个连等的操作 vm._data == option.data == dataoptionsnew vue 之后的 配置对象)
  • 不同之处 _datadata 不同的地方就是,_data 通过数据代理把所有的属性都添加到vm上,同时给对应属性添加getter/settter 方法,使其变为响应式,data纯粹的对象 (含有零个或多个的 key/value 对) 在这里插入图片描述

3 数据代理 Object.defineProperty()

3.1 基本应用
  • 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
          // 通过使用 Object.denfieProperty 添加属性age 并使其age 变量可以被枚举、修改、删除;
          let deptPerson3 = {
               name: '阿毛',
               sex: '男' ,
            }
          Object.defineProperty(deptPerson3,'age',{
               value: 18,
               enumerable: true , //控制属性是否可以被枚举,默认值为false 
               writable: true,  // 控制属性是否可以被 修改,默认值为false 
               configurable: true // 控制属性是否可以被 删除,默认值为false
          }) 
          console.log("deptPerson3: ",Object.keys(deptPerson3));
      ```
    
  • 添加属性后,页面打印效果如下图所示:
    在这里插入图片描述
  • 注意 以上Object.defineProperty中的控制属性默认值都是false 配置true才会生效
3.2 高级应用
  • Object.defineProperty() getter/setter 方案的高级应用

        // Object.defineProperty  高级配置项;getter   setter 方法使用;
       // 现提供  let number = 18 ;  要求 deptPerson4 对象要求有一个age 属性,并且deptPerson4 的年龄是读取number属性值 读取出来的;而不是自己手写的;
       let number = 18 
       let deptPerson4 = {
            name: '阿毛',
            sex: '男' ,
         }
       Object.defineProperty(deptPerson4,'age',{
            get(){
                console.log("有人要查看年龄了: ");
                return number;
            },
            set(value){
                console.log("有人要修改年龄了: ");
                number = value;
            }
       }) 
       console.log("deptPerson4: ",deptPerson4);
    
  • 页面显示打印效果如下图示例:
    在这里插入图片描述

  • 数据代理: 通过一个对象代理对另一个对象中属性的操作

        <!--
            数据代理: 通过一个对象代理对另一个对象中属性的操作
            例如: 有两个对象 let obj ={ x: 20} ; let obj2 = {y: 30} 
                 通过 obj2 对象 对 obj 对象的属性值 进行修改 ,这就是数据代理
        -->
      <script type="text/javascript">
        let obj = { x: 20} 
        let obj2 = {y: 30} 
    
        Object.defineProperty(obj2,'x',{ // 给obj2 添加一个 x 属性 
            get(){
                return obj.x;  // 获取obj2 中的X 其它就是返回了obj 中的x 
            },
            set(value){
                obj.x = value // 修改obj2 中的x 其它就是修改了 obj 中的X
            }
        })
      </script>
    
    • 页面运行效果,如下图所示:
      在这里插入图片描述
  • 搞定,太晚了,收工,争取明天 把剩余章节都整理完毕

《冬夜读书》 宋代 陆游 挑灯夜读书,油涸意未已;亦知夜既分,未忍舍之起

  • 虽无古时真正的情景,但明天还得努力,所以得早点眯眼啦

创作不易,欢迎 多多点赞,收藏 有不到位的欢迎指证
邮箱:pymxb1991@163.com
微信:py_mxb

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值