vue原理

又看了好几篇文章,之前一直感觉迷迷糊糊的,看的多了,这些概念进入脑子里面多了慢慢就有感觉了,因此得出一个结论,一个问题不懂,看一篇博客不懂,两篇还是不懂,那就看看看,看一百篇可能还不能精通,肯定能说懂了。

先上一张看了几次的图片:
在这里插入图片描述

  1. Vue原理简介
    Vue就是基于MVVM模式实现的一套框架,在vue中:

Model:指的是js中的数据,如对象,数组等等。
View:指的是页面视图
viewModel:指的是vue实例化对象

  1. 实现双向绑定(响应式)原理

观察者-订阅者(数据劫持),下面解释一下这句话

vueObserver 数据监听器,把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用Object.defineProperty()方法把这些属性全部转成setter、getter方法。当data中的某个属性被访问时,则会调用getter方法,当data中的属性被改变时,则会调用setter方法。
Compile指令解析器,它的作用对每个元素节点的指令进行解析,替换模板数据,并绑定对应的更新函数,初始化相应的订阅。
Watcher 订阅者,作为连接 Observer 和 Compile 的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数。
Dep 消息订阅器,内部维护了一个数组,用来收集订阅者(Watcher),数据变动触发notify 函数,再调用订阅者的 update 方法。

从图中可以看出,当执行 new Vue() 时,Vue 就进入了初始化阶段, 一方面Vue 会遍历 data 选项中的属性,并用 Object.defineProperty 将它们转为 getter/setter,实现数据变化监听功能; 另一方面,Vue 的指令编译器Compile 对元素节点的指令进行解析,初始化视图,并订阅Watcher 来更新视图,此时Wather 会将自己添加到消息订阅器中(Dep),初始化完毕。当数据发生变化时,Observer 中的 setter 方法被触发,setter 会立即调用Dep.notify(),Dep 开始遍历所有的订阅者,并调用订阅者的 update 方法,订阅者收到通知后对视图进行相应的更新。 因为VUE使用Object.defineProperty方法来做数据绑定,而这个方法又无法通过兼容性处理,所以Vue 不支持 IE8 以及更低版本浏览器。 另外,查看vue源代码,发现在vue初始化实例时, 有一个proxy代理方法,它的作用就是遍历data中的属性,把它代理到vm的实例上,因此我们可以这样调用属性:vm.aaa等于vm.data.aaa。