vue3中如何使用ref和reactive定义和修改响应式数据?

需求:vue3中setup组合式api中如何定义响应式数据并且修改赋值呢?

1、字符串/数字:“ref”是vue3中用来存储值的响应式数据源,它可以定义字符串,数字等

<script setup>
import { ref } from 'vue'
// “ref”是用来存储值的响应式数据源。
// 理论上我们在展示该字符串的时候不需要将其包装在 ref() 中,
const message = ref('Hello World!')
// 但是在这个示例中更改这个值的时候,就可以实现数据和页面响应式绑定了。
function changeMsg(data){
    //message=data   这种是不行的,无法实现双向绑定
    message.value=data
}
</script>
<template>
  <h1>{{ message }}</h1>
<button @click="changeMsg('数据修改')">Reverse Message</button>
</template>

2、数组/对象:引入 reactive 用来定义对象数据包括数组和对象

vue3使用proxy,对于对象和数组都不能直接整个赋值

<script setup>
import { reactive} from 'vue'
const arr = reactive([]);
const arr2=reactive({arr:[]});
const load = () => {
  const res = [2, 3, 4, 5]; //假设请求接口返回的数据
  //方法1 失败,直接赋值丢失了响应性
     arr = res;
  // 方法2 这样也是失败
     arr.concat(res);
  // 方法3 成功 插入数据,修改数据属性,但是很麻烦
  res.forEach(e => {
    arr.push(e);
  });
  // 方法4 成功 
   arr.value =res
  //方法5 成功
  arr2.arr = res
};
</script>
<template>
  <h1>Demo</h1>
</template>

3、问题怎么取到reactive对象,并将对象传给后端

我已经定义了reactiveobejct:

const selectedAnswers = reactive({})

稍后,我将值赋给此对象并可以看到它:

Proxy {2: "Lorem, ipsum dolor.", 4: "Lorem ipsum dolor sit axet consectetur adipisicing."}

我需要得到这个对象,并将其发送到后端,但不知道如何做到这一点。我可以访问选定的答案[2]它将打印“Lorem,ipsumdolor.”,但键可以更改,我尝试使用以下方法获取此对象:

selectedAnswers.value
selectedAnswers.values
...

我不能像“selectedAnswers”那样发送它,我需要以某种方式打开数据并将其作为纯JSON发送

解决方案

reactive对象上使用toRaw

const answers = toRaw(selectedAnswers)

这里就是vue3中setup组合式api中如何定义响应式数据并且修改赋值全部内容了


### Vue 3 中 `ref` `reactive` 的使用场景与区别 #### 单个响应式引用:`ref` 对于基本类型的变量,如字符串、数字或布尔,推荐使用 `ref` 来创建响应式的引用。通过 `ref` 创建的数据会自动解包,在模板中可以直接访问而无需 `.value` 属性;但在 JavaScript 中操作时则需显式调用 `.value` 进行读写[^1]。 ```javascript import { ref } from &#39;vue&#39; const count = ref(0) // 修改计数 count.value++ ``` #### 对象或数组的响应式处理:`reactive` 当涉及到复杂对象(包括嵌套属性)或是数组这类结构化数据时,则更适合采用 `reactive` 函数来定义响应式状态。它返回的是原始对象的一个代理版本,因此不需要像 `ref` 那样频繁地使用 `.value` 访问器[^2]。 ```javascript import { reactive } from &#39;vue&#39; const state = reactive({ message: &#39;Hello!&#39;, items: [&#39;a&#39;, &#39;b&#39;] }) state.message += &#39; World&#39; state.items.push(&#39;c&#39;) ``` #### 场景差异对比 - **简单类型 vs 复杂类型** 如果只是简单的基础类型数据变化跟踪需求,那么选用 `ref` 更加直观简洁;而对于多层嵌套的对象或者列表形式的数据集来说,利用 `reactive` 可以减少代码冗余并提高可维护性[^3]。 - **性能考量** 当应用规模较大且存在大量独立的小型状态变更时,考虑到每次更新都会触发视图重新渲染的成本问题,合理选择合适的工具也至关重要。通常而言,`reactive` 在处理大规模关联性强的状态集合方面表现更优。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言程序plus

你的鼓励将是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值