在Vue3中,响应式数据的实现方式从原来Vue2的Object.defineProperty()
更换为了Proxy
,本质上还是对数据进行拦截,通过getter
和setter
实现页面的响应式更新。
Object.defineProperty
存在的问题:解决方案:
Vue.set()
方法【或者vm中的$set
方法】Vue3中使用Proxy来代替Object.defineProperty()
,解决了上述问题
Proxy
使用示例:Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。
let objectDemo = { keyA: 1, keyB: 2, keyC: 3 } let proxyObject = new Proxy(objectDemo, { get(obj, prop){ console.log('getter was called!') console.log(`value is ${obj[prop]}`) return obj[prop] }, set(obj, prop, value){ console.log('setter was called') obj[prop] = value }, deleteProperty(target, prop) { console.log(`${p}属性被删除了`) return delete target[prop] } })
这段代码首先创建了一个普通对象objectDemo
,然后实例化了一个Prox对象,构造函数中分别传入了objectDemo
和一个配置对象。
配置对象中配置了getter和setter,可拦截数据进行操作。同时,当使用delete
关键字删除Proxy对象的属性时,deleteProperty
配置项的函数将会执行。