vue3_Suspense

166 阅读1分钟

它们允许我们的应用程序在等待异步组件时渲染一些后备内容,可以让我们创建一个平滑的用户体验

src\App.vue

<template>
    <h2>App父级组件:Suspense组件的使用</h2>

    <Suspense>
        <template #default>
            <!-- 异步组件 -->
            <!-- <AsyncComponent /> -->
            <AsyncAddress />
        </template>
        <template v-slot:fallback>
            <!-- loading -->
            <h2>Loading</h2>
        </template>
    </Suspense>
</template>

<script lang="ts">
import { defineAsyncComponent, defineComponent } from 'vue'

import AsyncComponent from './components/AsyncComponent.vue'
import AsyncAddress from './components/AsyncAddress.vue'
export default defineComponent({
    components: {
        AsyncComponent,
        AsyncAddress,
    },
    name: 'App',
    setup() {
        return {}
    },
})
</script>

src\components\AsyncAddress.vue

<template>
    <h2>AsyncAddress组件</h2>
    <h3>{{data}}</h3>
</template>

<script lang="ts">
import { defineComponent } from 'vue'
import axios from 'axios'

export default defineComponent({
    name: 'AsyncAddress',
    // 方法一
    // setup() {
    //     return axios.get('/data/address.json').then((response) => {
    //         return {
    //             data: response.data,
    //         }
    //     })
    // },
    // 方法二
    async setup() {
        const result = await axios.get('/data/address.json')
        return { data: result.data }
    },
})
</script>

src\components\AsyncComponent.vue

<template>
    <h2>AsyncComponent子集组件</h2>
    <h3>{{msg}}</h3>
</template>

<script lang="ts">
import { defineComponent } from 'vue'

export default defineComponent({
    name: 'AsyncComponent',
    setup() {
        // 方法三
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve({
                    msg: 'do you love me',
                })
            }, 2000)
        })
    },
})
</script>