1.Vue的双向绑定原理?
Vue采用的是MVVM模式,也就是数据驱动视图。有四个角色类型,分别是监听器(Observer),订阅器(Dep),Watcher(订阅者),解析器(Compile)。监听器判断对象的值是否为数组类型,如果是就拦截数组的原型操作,对数组的值进行遍历观测。如果是对象类型,那么就遍历观测。订阅器用来收集Watcher(订阅者)和通知订阅者进行更新,每个属性都拥有自己的订阅器, 当数据发送改变的时候,就会通知所有的订阅者更新。订阅者分为三种,渲染Watcher,计算属性Watcher,侦听器Watcher,计算属性Watcher主要指Computed,特点是具备lazy属性,当页面读取到属性时,才会重新计算,而且只有在数据变更时才会重新计算。适合同步等时间开销比较小的操作。侦听器Watcher主要指watch,watch不具备lazy特性,只要属性改了就会触发已经定义好的回调函数,适合异步请求等时间开销比较大的操作。渲染Watcher指每一个组件都会有渲染Watcher,负责监听组件data/computed改变的时候更新视图。这三个顺序一般是computed->watch->render watcher,保证页面获取的是最新的数据。总而言之,初始化Watcher的时候,会去调用getter方法去读取值,然后将自身设置到Dep.target上,对象属性值被读取的时候,会将当前的watcher填充到依赖里面,等属性更新的时候会通知watcher去调用update方法,从而更新页面。之后释放掉Dep.target。解析器用来解析当前模板的动态指令,负责初始化模板数据和相应的订阅器。
综上所述,Vue使用了发布订阅加数据劫持的方式,实现了数据与页面的双向绑定。也就是响应式原理。