解释1:
vue2 采用了 defineProperty(Vue.util.defineReactive) 将数据定义成了响应式数据(拦截所有的属性,增加了getter和setter)。
对数组并没有采用defineProperty,因为数组中可能数据很长,但是用户不会操作索引更改数据
vue2缺陷:要递归监控,不存在的属性无法被监控到。
如何避免缺陷:vue2 减少层级嵌套不要过深
如果不需要响应式数据就不要放在data中,合理使用Object.freeze
尽量缓存使用过的变量
vue3 采用了proxy直接可以对象拦截,不用重写get和set方法,性能高,不需要直接递归。
解释2:
响应式:数据改变,视图跟着更新
1 vue2是通过Object.defineProperty() get,set来进行数据劫持(Observer)实现的,Object.defineProperty是默认对数据第一层进行计算,
如果数据嵌套过多,递归调用很耗性能。
2 vue3:采用proxy(无论是简单数据还是复杂数据都可以进行劫持)。 如果是多层次数据,不使用就不会递归(懒递归)