
1) 【一句话结论】Vue通过依赖收集(Dep)和依赖触发(Watcher)机制实现数据变化到视图更新的流程,数据变化时触发依赖更新视图。Vue2基于Object.defineProperty实现,Vue3改用Proxy,在性能和类型支持上更优。
2) 【原理/概念讲解】Vue响应式系统的核心是“依赖收集 + 触发更新”机制:
3) 【对比与适用场景】
| 特性 | Vue2 | Vue3 |
|---|---|---|
| 响应式实现 | Object.defineProperty | Proxy |
| 数据类型支持 | 仅对象(数组需手动处理) | 所有类型(数组、Map等) |
| 性能 | 较低,数组操作需手动触发 | 较高,Proxy拦截所有操作 |
| 内存占用 | 较高 | 较低 |
| 适用场景 | 旧项目迁移 | 新项目开发 |
4) 【示例】
let data = { count: 0 };
Object.defineProperty(data, 'count', {
get() { console.log('get count'); },
set(newVal) {
console.log('set count to', newVal);
// 更新视图
}
});
let data = { count: 0 };
const mutableProxy = new Proxy(data, {
get(target, key) {
console.log('get', key);
return target[key];
},
set(target, key, newVal) {
console.log('set', key, 'to', newVal);
// 更新视图
}
});
5) 【面试口播版答案】
“面试官您好,Vue的响应式系统核心是通过依赖收集和触发机制实现数据变化到视图更新的流程。具体来说,数据变化时,Vue会触发依赖更新,进而更新视图。Vue2基于Object.defineProperty实现,而Vue3改用Proxy,性能和类型支持更好。下面我详细解释流程和差异:
首先,Vue通过拦截数据的访问和修改操作,实现响应式。数据访问时收集依赖(Watcher),数据修改时触发依赖更新。Vue2使用Object.defineProperty,仅能拦截对象属性,数组需手动触发;Vue3使用Proxy,能拦截所有操作,支持更复杂类型,性能更高。总结来说,Vue3的响应式系统在实现和性能上更优,适合新项目开发。”
6) 【追问清单】
7) 【常见坑/雷区】
vm.arr.push()需手动调用$set)。delete),但Vue3通过Reflect.deleteProperty处理。