Vue2 和 Vue3 的响应式原理有何不同?为什么 Vue3 用 Proxy?
- Vue2:用
Object.defineProperty递归劫持每个属性的get/set。缺陷:① 数组索引/长度变化监听不到(需重写数组方法);② 新增/删除属性需Vue.set;③ 初始化时递归遍历全对象,大对象成本高 - Vue3:用
Proxy代理整个对象 +Reflect。优势:① 懒代理(访问到才递归);② 天然监听新增/删除属性(deleteProperty);③ 数组原生支持;④ 不需要Vue.set
const p = new Proxy(obj, {
get(t, k, r) { track(); return Reflect.get(t, k, r) },
set(t, k, v, r) { const ok = Reflect.set(t, k, v, r); trigger(); return ok }
})代价:Proxy 无法 polyfill 到 IE,这也是 Vue3 放弃 IE 支持的原因。