vue3中响应式与reactive讲解

76 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

reactive

作用: 定义多个数据的响应式

const proxy = reactive(obj)

接收一个普通对象然后返回该普通对象的响应式代理器对象

响应式转换是"深层的": 会影响对象内部所有嵌套的属性

内部基于ES6的 proxy 实现,通过代理对象操作源对象内部数据都是响应式的

 

setup() {

const obj: any = {

name: '小明',

age: 20,

wife: {

name: '小红',

age: 18,

cars: ['奔驰', '宝马', '奥迪']

}

}

}

 

//把数据变成响应式的数据

//返回的是一个proxy的代理对象,被代理的目标对象就是obj对象

//user现在是代理对象, obj是目标对象

//user对象的类型是Proxy

const user = reactive(obj)

//方法

function updateUser() {}

const updateUser = () => {

user.gender = '男' //界面可以更新渲染,而且这个数据最终也添加到了obj对象了

delete user.age //界面更新渲染了, obj中缺失没有了age这个属性

}

return {

user,

updateUser

}

 

vue3响应式 深层检出

cosnt proxyUser = new Proxy(user, {

//获取目标对象的某个属性值

get(target, prop) {

console.log('get调用了')

return Reflect.get(target, prop)

},

//修改目标对象的属性值/为目标对象添加新的属性

set(target, prop, val) {

return Reflect.set(target, prop, val)

},

//删除目标对象上的某个属性

deleteProperty(target, prop) {

return Reflect.deleteProperty(target, prop)

}

})

 

//通过代理对象获取目标对象中的某个值

console.log(proxyUser.name);

//通过代理对象更新目标对象上的某个属性值

proxyUser.name = '123'

//通过代理对象向目标对象中添加一个新的属性

proxyUser.gender = '男'

delete proxyUser.name

//更新目标对象中某个属性对象中的属性值

proxyUser.wife.name = '123'

setup执行时机

//setup是在beforeCreate生命周期回调之前就执行一次

//由此可以推断出: setup在执行的时候,当前的组件还未创建出来, 导致this不能使用

//this是undefined,说明, 就不能通过this再去调用data/computed.methods中的相关内容

setup() {

console.log('setup执行了', this)

return {

//setup中一般都是返回一个对象,对象中的属性和方法都可以在html模板中直接使用

}

}