vue双向绑定原理
vue.js采用数据劫持结合发布者-订阅者模式的方式实现双向绑定,通过Object.defineProperty()来劫持各个属性的setter、getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
其中最核心的方法便是通过Object.defineProperty()来实现对属性的劫持,那么在设置或者获取的时候我们就可以在get或者set方法里加入其他的触发函数,达到监听数据变动的目的。
每个组件实例都有相应的watcher实例对象,它会在组件渲染的时候把属性记录为依赖,之后当依赖的setter被调用时,会通知watcher重新计算,从而致使它关联的组件得以更新。因此,每当数据变化的时候会引起视图的变化,更新view。
vue如何实现双向绑定
1、observer用来实现对每个vue中的data中定义的属性循环用Object.defineProperty()实现数据劫持,以便利用其中的setter和getter,然后通知订阅者,订阅者会触发它的update方法,对视图进行更新。
2、在vue中v-model、v-name、{{}}等都可以对数据进行显示,也就是说加入一个属性都通过这三个指令了,那么每当这个属性改变的时候,相应的这个三个指令的html视图也必须改变,于是vue中就是每当有这样的可能用到双向绑定的指令,就在一个Dep中增加一个订阅者,其订阅者只是更新自己的指令对应的数据,也就是v-model='name'和{{name}}有两个对应的订阅者,各自管理自己的地方。每当属性的set方法触发,就循环更新Dep中的订阅者。
vue删除数据监测不到?
因为Vue在初始化实例时会对属性进行getter/setter转化,这样被转化的属性就是响应式的,而只有在data中声明的属性会执行这个过程。所以,后续通过JavaScript传过来的对象属性因为没有在data中声明,所以并不会执行这个转化过程,因此这些属性全都是不响应式的。
也是因为这个原因,现在的Vue.js无法监听到对象属性的添加和删除,也无法检测到数组的变动。
解决方法参照1
解决方法参照2
参考:
链接1
链接2