![](/img/trans.png)
[英]What is the proper way to test Vue3 async setup component with suspense?
[英]what is wrong with this async function in Vue3?
这是一个非常简单的概念错误,但无论如何我无法解决它,我在 onMounted 钩子中制作 axios.get() ,在 onMounted 块内一切都显示正确⇾三个对象的数组. 但是一旦我将它返回到模板并对其进行插值以查看该值只是一个空数组。
这是代码:
<template>
<div class="container">
<h1>Events for good</h1>
<img alt="Vue logo" src="../assets/logo.png" />
<EventCard v-for="event in events" :key="event.id" :event="event"/>
{{ events }}
</div>
</template>
<script lang="ts">
import { defineComponent, onMounted, reactive } from 'vue';
import { Event } from '@/types/event';
import EventCard from '@/components/EventCard.vue';
import axios from 'axios';
export default defineComponent({
name: 'EventList',
components: {
EventCard
},
setup() {
let events = reactive<Event[]>([])
onMounted( async() => {
const response = await axios.get('http://localhost:3000/events');
console.log(response.data)
events = response.data
console.log(events)
})
return {
events
}
}
});
</script>
尝试使用Object.assign
来改变反应数据:
Object.assign(events, response.data)
或者使用响应定义 state 并将events
定义为字段:
let state = reactive({
events:[]
})
...
state.events = response.data
events
被response.data
覆盖,这有效地从组件的上下文中删除了原始的reactive()
实例:
let events = reactive<Event[]>([])
onMounted(async () => {
⋮
events = response.data // ❌ `events` is now the same as `response.data`,
// and the original value is gone!
})
注意:在这里使用const
通常可以防止这些错误:
const events = reactive<Event[]>([]) // 👍 const prevents accidental overwrites like above
一种解决方案是将events
声明为ref
而不是reactive
:
const events = ref<Event[]>([])
onMounted(async () => {
⋮
events.value = response.data // ✅ `events.value` is now the same value as `response.data`
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.