Vue3.0 里为什么要用 Proxy API 替代 defineProperty API?

响应式优化。
1. defineProperty API 的局限性最大原因是它只能针对单例属性做监听。
Vue2.x 中的响应式实现正是基于 defineProperty 中的 descriptor,对 data 中的属性做了遍
历 + 递归,为每个属性设置了 getter、setter。
这也就是为什么 Vue 只能对 data 中预定义过的属性做出响应的原因,在 Vue 中使用
下标的方式直接修改属性的值或者添加一个预先不存在的对象属性是无法做到 setter 监
听的,这是 defineProperty 的局限性。
2. Proxy API 的监听是针对一个对象的,那么对这个对象的所有操作会进入监听操作,这
就完全可以代理所有属性,将会带来很大的性能提升和更优的代码。
Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须
先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。
3. 响应式是惰性的
在 Vue.js 2.x 中,对于一个深层属性嵌套的对象,要劫持它内部深层次的变化,就需要
递归遍历这个对象, 执行 Object.defineProperty 把每一层对象数据都变成响应式的,这
无疑会有很大的性能消耗
在 Vue.js 3.0 中,使用 Proxy API 并不能监听到对象内部深层次的属性变化,因此它的
处理方式是在 getter 中去递归响应式,这样的好处是 真正访问到的内部属性才会变成响
应式,简单的可以说是按需实现响应式,减少性能消耗

猜你喜欢

转载自blog.csdn.net/zhangwenok/article/details/125097557