Chargement asynchrone des composants avec defineAsyncComponent en Vue.js

Considérations importantes

La fonctionnalité de chargement asynchrone des composants via defineAsyncComponent dans Vue.js est exclusive aux environnements web (H5). Elle n'est pas supportée pour les applications natives (APP) ni pour les WeChat Mini Programs.

Pour ces plateformes, il est possible d'implémenter une alternance de composants (sans chargement asynchrone) avec le code suivant :

Template :

<button @click="switchComp">Charger le composant</button>
<component :is="activeComponent"></component>

Script :

import StaticComp from '@/components/StaticComp.vue'
const activeComponent = ref(null)
function switchComp() {
    activeComponent.value = StaticComp
}

Implémentation du chargement asynchrone en environnement H5

Approche 1 : Appel simpliifé de defineAsyncComponent

Template :

<template>
    <div class="wrapper">
        <button @click="initialize">Charger le composant</button>
        <component :is="dynamicComp"></component>
    </div>
</template>

Script :

<script setup>
import { defineAsyncComponent, shallowRef } from 'vue'

const asyncElement = defineAsyncComponent(() => import('./components/AsyncModule.vue'))
const dynamicComp = shallowRef(null)

const initialize = () => {
    dynamicComp.value = asyncElement
}
</script>

Approche 2 : Configuration avancée avec options

Template :

<template>
    <div class="container">
        <button @click="initialize">Charger le composant</button>
        <component :is="dynamicComp"></component>
    </div>
</template>

Script :

<script setup>
import { ref, defineAsyncComponent, shallowRef } from 'vue'
import Spinner from '@/components/Spinner.vue'
import ErrorDisplay from '@/components/ErrorDisplay.vue'

const advancedAsync = defineAsyncComponent({
    loader: () => import('./modules/DataViz.vue'),
    loadingComponent: Spinner,
    errorComponent: ErrorDisplay,
    timeout: 3000
})

const dynamicComp = shallowRef(null)
const initialize = () => {
    dynamicComp.value = advancedAsync
}
</script>

Approche 3 : Utiilsation du composant Suspense intégré

Cette méthode repose entièrement sur le template. Notez que le compoasnt Suspense est expérimental et susceptible de changements.

<Suspense>
    <template #default>
        <AsyncWidget />
    </template>
    <template #fallback>
        <LoadingIndicator />
    </template>
</Suspense>

Étiquettes: vue defineasynccomponent suspense h5 async-component

Publié le 5 juillet à 02h09