响应性reactivite
vue2
vue2采用数据劫持结合发布-订阅模式,通过object.defineProperty劫持各个属性的setter、getter实现。
- 缺点:
- 无法检测到对象属性的新增或删除的变化。解决方法:新增:Vue.delete
- 无法正确的监听数组的方法(当监听的下标对应的数据发生改变时)。解决方法:重写数组的部分方法实现响应式,push\pop\shift\unshift\splice\reverse
为啥vue2中无法监听数组和对象的这些变化的原因
- 数组---- 因为数组长度不定而且数据可能会很多,如果对每一个数据都实现监听,性能代价太大
- 对象---- object.defineProperty()针对的是对象的某个属性,而且这个操作在vue的初始化阶段就完成了,所以新增的属性无法监听,通过set方法新增对象就相当于初始化阶段的数据响应式处理
vue3
vue引入了反射和代理的概念,reflect和proxy。利用Proxy直接代理一个对象,得到一个proxy实例的代理对象。 proxy只能实现代理复杂数据类型,vue又提供了ref方法,用来处理简单数据类型的响应性。