vue3 响应式数据重新赋值后,reactive 丢失响应式,而 ref 不会

文章讨论了在Vue中使用ref和reactive进行响应式数据处理时遇到的问题。当使用reactive修改数据时,响应式可能会丢失,而ref仍然保持其响应性。作者观察到,可能的原因是数据更新后Vue重新刷新了整个setup,而非仅修改响应式数据。这种行为导致了预期之外的结果,尤其是在操作顺序改变时。

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

完整调试 代码

<template>
  <div>{{ refObj.b }}</div>
  <div>{{ reactiveObj.a }}</div>
  <div>
    <button @click="changeRef">修改Ref</button>
    <button @click="changeReactive">修改Reactive</button>
    <button @click="resetRef">重置Ref</button>
    <button @click="resetReactive">重置Reactive</button>
  </div>
</template>

<script setup>
import { ref, reactive } from 'vue'

let refObj = ref({
  b: 'ref-111111111'
})
let reactiveObj = reactive({
  a: 'reactive-111111111',
  c: 'ccccccccc'
})
function changeRef() {
  refObj.value = { b: 'ref-2222222' }
  console.log('changeRef', refObj, reactiveObj)
}
function changeReactive() {
  reactiveObj = { a: 'reactive-22222222' }
  console.log('changeReactive', refObj, reactiveObj)
}
function resetRef() {
  refObj.value = {
    b: 'ref-111111111'
  }
  console.log('resetRef', refObj, reactiveObj)
}
function resetReactive() {
  reactiveObj = { a: 'reactive-111111111' }
  console.log('resetReactive', refObj, reactiveObj)
}
console.log('base', refObj, reactiveObj)
</script>
<style scoped>
button {
  border: 1px solid #333;
  padding: 5px 10px;
  margin-right: 20px;
}
</style>

在这里插入图片描述

第一个问题:reactive响应式丢失,ref响应式没有丢失

1、点击 第二个按钮 修改Reactive的值 页面没有任何变化,控制台中可以看到使用reactive做响应式的数据 reactiveObj 丢失响应式
在这里插入图片描述
2、刷新页面后 点击 第一个按钮 修改Ref的值 页面数据发生变化,控制台中可以看到使用ref做响应式的数据 refObj 还是一个RefImpl(ref对象),响应式还在。
在这里插入图片描述

注意:使用reactive 做相应式时,直接拿当前值做修改( 如上案例中 reactiveObj),会丢失响应式;最好的方法就是多套一成 上面案例中就是修改 reactiveObj.a 的值 如不是直接修改 reactiveObj 的值

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值