Vue2的响应式
问题
1.解释什么是响应式: 组件数据的变化,会立即触发视图的更新
2.原理: vue通过调用API Object.defineProperty()进行数据劫持结合发布-订阅的方式来实现响应式
具体过程:
1.数据对象传入observe()方法里面,查看ob属性,创建observe实例(def方法标记ob属性),同时会有Dep实例。
2.判断数据对象属性中,如果是对象则调用walk 方法遍历每一项并用defineReactive方法加工(对传入的属性进行数据劫持,设置get和set 方法),如果是数组(重写能改变自身的七个API arrayMethods方法,将方法进行响应式处理后覆盖到旧方法上(响应式处理的数组arr的__proto__指向arrayMethods))
3.Dep实例(连接observe和watcher实例),subs数组里面存放Watcher实例(指令和数据绑定的时候生成,链接模板和observe)—构成依赖关系,当数据变化时,setter方法被调用,触发dep.notify方法,通知Watcher去执行run方法更新视图
缺点:
- Vue 是无法检测到对象属性的添加和删除,但是可以使用全局
Vue.set方法(或vm.$set实例方法)。 - Vue 无法检测利用索引设置数组,但是可以使用全局
Vue.set方法(或vm.$set实例方法)。 - 无法检测直接修改数组长度,但是可以使用 splice。
vue3响应式原理
实现原理:
- 通过Proxy(代理):拦截对象中任意属性的变化,包括属性的读写,属性的添加,属性的删除等。
- 通过Reflect(反射):对源对象的属性进行操作