zoukankan      html  css  js  c++  java
  • Vue----数据响应原理

     1 <body>
     2   <script src="./Dvue.js"></script>
     3   <script>
     4     const app = new DVue({
     5       data: {
     6         test: "I am test",
     7         foo: {
     8           bar: "bar"
     9         }
    10       }
    11     })
    12 
    13     app.$data.test = "hello world!"  // 属性更新了:hello kaikeba!
    14     // app.$data.foo.bar = "hello!"
    15   </script>
    16 </body>

    Dvue.js

     1 class DVue {
     2   constructor(options) {
     3     this.$options = options
     4 
     5     // 数据响应化
     6     this.$data = options.data
     7     this.observe(this.$data)
     8   }
     9 
    10   observe(value) {
    11     // 判断value是否是对象    
    12     if (!value || typeof value !== 'object') {
    13       return
    14     }
    15     
    16     // 遍历该对象
    17     Object.keys(value).forEach(key => {
    18       this.defineReactive(value, key, value[key])
    19     })
    20   }
    21 
    22   // 数据响应化
    23   defineReactive(obj, key, val) {
    24     // 判断val内是否还可以继续调用(是否还有对象)
    25     this.observe(val) // 递归解决数据嵌套
    26 
    27     Object.defineProperty(obj, key, {
    28       get() {
    29         // 读取的时候 判断Dep.target是否有,如果有则调用addDep方法将Dep.target添加到deps数组上
    30         return val
    31       },
    32       set(newVal) {
    33      // 判断数据更新前后是否一样
    34         if (newVal === val) {
    35           return;
    36         }
    37         val = newVal
    38         console.log(`${key}属性更新了:${val}`)
    39       }
    40     })
    41   }
    42 }
  • 相关阅读:
    rpm包的管理
    多态应用实例--制作饮品
    纯虚函数和抽象类
    rpm包的管理
    动态监控进程
    封装继承和多态
    计网面试题
    模拟浏览器加载页面时的版本下载
    xpath中extract()使用
    MVC+EF CODE FIRST的使用
  • 原文地址:https://www.cnblogs.com/PasserByOne/p/12132599.html
Copyright © 2011-2022 走看看