【发布时间】:2022-01-24 15:36:30
【问题描述】:
我有一个使用组合 API 的 Vue3 应用程序,并希望在 setup 函数内异步获取数据。
对我有用的方法:
使用承诺
<template>
<div>{{ result }}</div>
</template>
<script lang="ts">
import { defineComponent, ref } from "vue";
export default defineComponent({
setup() {
const result = ref();
fetch("https://api.publicapis.org/entries")
.then((response: Response) => response.json())
.then((jsonResponse: any) => {
result.value = jsonResponse;
});
return { result };
},
});
</script>
使用 onMounted 挂钩
<template>
<div>
{{ result }}
</div>
</template>
<script lang="ts">
import { defineComponent, ref, onMounted } from "vue";
export default defineComponent({
setup() {
const result = ref();
onMounted(async () => {
const response = await fetch("https://api.publicapis.org/entries");
result.value = await response.json();
});
return { result };
},
});
</script>
但我不能像这样直接使用 async/await
<template>
<Suspense>
<template #default>
{{ result }}
</template>
<template #fallback> Loading... </template>
</Suspense>
</template>
<script lang="ts">
import { defineComponent, ref } from "vue";
export default defineComponent({
async setup() {
const result = ref();
const response = await fetch("https://api.publicapis.org/entries");
result.value = await response.json();
return { result };
},
});
</script>
基于这个问题
@vue-composition / How can I use asynchronous methods in setup()
还有这篇链接的文章
https://vueschool.io/articles/vuejs-tutorials/suspense-new-feature-in-vue-3/
它应该可以工作。
发布的组件只是 Vue 路由器渲染的默认 Home.vue 组件。所以在 App.vue 中,我使用标签 <router-view /> 并使用主路由加载应用程序。
如何将setup 标记为async?
【问题讨论】:
-
您没有展示该组件的使用方式。异步设置应专门用于悬念。
-
等一下,我会更新我的问题
-
@EstusFlask 它只是 CLI 生成的基本应用程序骨架中的 Home.vue 视图组件
标签: vue.js vuejs3 vue-suspense