8_vue是如何进行数据代理的( 二 )


修改成全大写

8_vue是如何进行数据代理的

文章插图
分析过程
8_vue是如何进行数据代理的

文章插图
  1. 我们修改了vm.name的值
  2. 一定调用了 set函数 , 拿到这个value值
  3. 并且将这个 value值赋给了vm._data(data)
图文解析第一部分一切的一切都是因为开头写了这段代码
8_vue是如何进行数据代理的

文章插图
紧随其后,马上就给我们创建了一个vue的实例对象
8_vue是如何进行数据代理的

文章插图
然后,vue开始为vm这个实例对象准备一些东西(属性)
8_vue是如何进行数据代理的

文章插图
重点 , data来了,完全来自于上方的配置项data
8_vue是如何进行数据代理的

文章插图
截止到目前来说 , 没有数据代理的存在 。我们所写的data,就是单纯的进行了一次赋值,然后给了下划线data(_data)
第二部分实际上 , vue做到这一步已经差不多了,代码也是可以写下去的
但是 , 请问,目前vm身上 , 有name吗,没有
但是我能拿到name的值吗?可以的,因为我有 _data
8_vue是如何进行数据代理的

文章插图
一样可以拿到name和phone的值
8_vue是如何进行数据代理的

文章插图
因为,vm这个对象身上的所有属性,在模板上面都能够直接使用
但是这样写,那不是直接崩溃,创建一个变量就需要 _data一次,vue在这里做了一个很棒的操作
也就是数据代理
第三部分
8_vue是如何进行数据代理的

文章插图
  1. vm在自己身上创建了一个变量name
  2. 什么方式创建的?defineProperty
  3. 通过get拿到vm自身上的_data.name的值
  4. 修改数据的时候通过set,获取value,然后再将_data当中的属性进行修改
  5. 完成了数据代理,双向绑定
为什么要将data当中的数据放在vm身上一份呢(_data)
就是为了让你编码的时候更方便(不至于每次都是 _data.xxx)
8_vue是如何进行数据代理的

文章插图
总结
  1. vue中的数据代理
    • 通过vm对象 来 代理 data对象(配置项)中的属性操作(get/set)
  2. Vue中数据代理的好处
    • 更加方便操作data中的数据(_data.xxx)
  3. 基本原理
    1. 通过Object.defineProperty()将data配置项当中的所有属性配置到vm对象上
    2. 为每一个添加到vm上的属性,指定一个get和set函数(getter/setter)
    3. 在getter/setter内部去操作(读/写),data中对应的属性
展开_data思考
8_vue是如何进行数据代理的

文章插图
老师不让展开是对的
因为如果按照之前的理解,这个符号代表什么 (...) 代表数据代理
这样容易引起理解误区, , 这里实际上并不是数据代理,而是做了一个数据劫持
我希望看到的 _data的展开内容是什么?是这样的
8_vue是如何进行数据代理的

文章插图
实际上并不是
vue的承诺只要你敢修改data当中的属性值 , 我就敢在页面当中 {{property}}一起发生变化
8_vue是如何进行数据代理的

文章插图
  1. 当name的值发生了改变,最终影响到的是谁 === _data.name
  2. 那么页面元素是怎么同步进行修改的?
  3. vue是不是必须要知道,name这里发生了改变,他需要做什么 === 监听
  4. 经历了一系列变动后,完成了小小的升级 , 最终达成响应式操作
【8_vue是如何进行数据代理的】

推荐阅读