Search code examples
vue.jsvue-componentvuejs3vue-composition-api

Why did I get blank (empty) content when I used async setup() in Vue.js 3?


Problem

I use async setup() in Vue.js 3, but I got my HTML content to disappear. My component template did not insert to HTML, but when I remove the async and await prefix, my HTML content comes back. How can I fix this?

async setup () {
    const data = ref(null)
    try {
        const res = await fetch('api')
        data.value = res.json()
    }
    catch (e) {
        console.error(e)
    }
    return {
        data
    }
}

I've tried

  1. I checked fetch, and it returned the correct response
  2. I've tried <Suspense> tag, but still the same problem

Solution

  • Your component's async setup() looks fine other than the missing await res.json(), which still wouldn't cause the problem you're seeing. I suspect your usage of <Suspense> is incorrect.

    To use async setup() in a component, the parent component must use that component in a <Suspense> tag:

    <!-- Parent.vue -->
    <template>
     <Suspense>
       <MyAsyncComponent />
     </Suspense>
    </template>
    

    You could also use the default and fallback slots of <Suspense> to show a loading indicator while waiting for the child component's setup to resolve:

    <!-- Parent.vue -->
    <template>
     <Suspense>
       <template #default>
         <MyAsyncComponent />
       </template>
       <template #fallback>
         <span>Loading...</span>
       </template>
     </Suspense>
    </template>
    

    demo