问题:vue3中reactive对象赋值,不能响应式变化
在使用vue3中,使用reactive创建的对象或者数组进行赋值时,可以正常赋值,但是不会触发响应式变化。
例子:
<script setup lang="ts">
import { ref,reactive } from 'vue'
let list = reactive<string[]>([]);
let obj = reactive({});
function add(){
setTimeout(()=>{
obj = {
name:'meowrain',
age:20
}
console.log(obj);
},2000)
}
</script>
<template>
<div>
<button @click="add">add</button>
<div>{{ obj }}</div>
</div>
</template>
<style></style>
我们按下按钮,等待2秒
可以看到obj的值已经发生了变化,但是页面没有进行渲染,与此同时,obj的响应式对象被破坏(本来应该是Proxy(Object) {}
类型的,现在成了纯粹的普通对象了
解决办法
方法1
直接添加对象的属性
<script setup lang="ts">
import { ref,reactive } from 'vue'
let list = reactive<string[]>([]);
let obj = reactive({});
console.log(obj);
function add(){
setTimeout(()=>{
obj.name = 'meowrain'
obj.age = '120'
console.log(obj);
},2000)
}
</script>
<template>
<div>
<button @click="add">add</button>
<div>{{ obj }}</div>
</div>
</template>
<style></style>
按下按钮
数组的话就是调用push,然后把异步获取的数据解构传入就行了
方法2
使用ref
不必多说,直接ref包起来给xxx.value赋值就行