Vue响应式原理

144 阅读1分钟

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(反射):对源对象的属性进行操作