介绍
在上次ref的使用中我们提到,vue3对象的响应式通过reactive来实现。
示例
setup(props,context){
let data=reactive({
name:'张三',
age:18,
hobby:['抽烟','喝酒','烫头']
})
function changeInfo() {
data.hobby[0]='学习'
}
return{
data,
changeInfo
}
}
- 在vue3中,对象的响应式原理采用了proxy实现。proxy是es6的一个新的技术,proxy(代理对象)。
vue3响应式原理解析
const p=new Proxy(person,{
// 读取属性时触发
get(target,propName){
return target[propName]
},
// 新增或修改属性时触发
set(target,propName,value){
target[propName]=value
},
/* 删除属性时触发 */
deleteProperty(target,propName){
delete target[propName]
}
})
let x1= Reflect.defineProperty(person,'name',{
get(){
return 3
}
})
let x2= Reflect.defineProperty(person,'name',{
get(){
return 4
}
})
-
与Object.defineProperty不同的是,prosy可以直接监听或拦截对象属性修改的操作。通过 Reflect.defineProperty()来修改源数据的
- Reflect.setPrototypeOf
- Reflect.deleteProperty
- Reflect.getPrototypeOf
以上三个Reflect的操作可以直接操作对象的属性,和object操作一样。
结尾
在vue3中更多的推荐使用reactive来定义数据。