vue3对一个reactive对象重新赋值失去响应式问题

在Vue中,对reactive对象的异步赋值可能导致响应式失效,因为Vue使用缓存队列处理修改操作,只在下次DOM更新时执行一次。为解决此问题,可以使用ref来代理赋值,确保属性更新被追踪。同步赋值则不会遇到此问题,因为Vue会捕获最后一次操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题场景

在一个异步请求中,对一个reactive对象重新赋值,失去响应式。

解决办法

在定义reactive的时候使用ref代理,在reactive中设置一个属性,用属性来代理重新变化的值。

// 使用reactive的某个属性来代替
let obj = reactive({
    data:''
})

//模拟异步操作
setTimeout(() => {
obj.data = 'Hello World!'
},1000)
// 使用ref来代替
let demo = ref()
// 模拟异步操作
setTimeout(() => {
    demo.value = {
    name:'小花'
}
},1000)

为什么产生这种原因

举个栗子
在这里插入图片描述

由图我们知道,对a重新赋值,vue的指向并未指向新的内存地址。所有对a的异步请求的重新赋值均失效。

那为什么ref却可以?

对于一个复杂引用数据类型,ref的底层还是用reactive代理。所有是相当于修改ref的某一个属性,还是同一块内存地址,同理,用reactive的某个属性代理修改的数据也是相同的原理。

为什么必须是异步的赋值才会导致该问题呢?

在vue中,所有对响应式的修改,并不是同步触发的,而是通过一个缓存队列才存储修改的操作,在下一次DOM更新循环之后执行。也就是说无论修改多少次,vue只更新一次,所以对vue来说,它只看最后一次操作。所以在同步中对一个reactive重新赋值是可以被监听到的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值