一、Vue3 数据响应式原理
(一)Proxy 替代 Object.defineProperty
在 Vue2 中,数据响应式是通过 Object.defineProperty 实现的。这种方法虽然能够监听对象属性的变化,但也存在一些局限性:
- 无法监听新增或删除的属性:如果动态地向对象添加新属性,Vue2 是无法检测到的。
- 数组操作的支持有限:对于数组的操作(如
push、pop等),需要额外处理。 - 性能问题:当对象层级较深时,递归遍历所有属性会带来较大的性能开销。
为了解决这些问题,Vue3 引入了 Proxy 对象来实现数据响应式。Proxy 提供了更强大的功能,可以拦截对目标对象的各种操作,包括属性读取、赋值、删除、数组索引访问等。
Proxy 的优势:
- 全面性:可以监听对象的新增属性和删除属性。
- 高效性:无需递归遍历整个对象树,只有在访问某个属性时才会触发代理。
- 支持数组操作:可以直接监听数组的变化,例如
push、splice等方法。
以下是一个简单的 Proxy 示例,展示了如何监听对象的变化:
const target = {
name: 'Vue3',
features: ['Composition API', 'Teleport', 'Fragments']
};
const handler = {
get(target, key, receiver) {
console.log(`获取属性: ${
key}`);
return Reflect.get(target, key, receiver);
},
set(target, key, value, receiver) {
console.log(`设置属性: ${
key} -> ${
value}`);
return Reflect.set(target, key

最低0.47元/天 解锁文章
1626

被折叠的 条评论
为什么被折叠?



