defineAsyncComponent
menerima fungsi kilang sebagai penggunaan asasnya Fungsi kilang ini mesti mengembalikan Promise
dan Promise
daripada resolve
harus mengembalikan a. komponen.
Mari kita ambil projek yang dibuat oleh Vue Cli sebagai contoh Di sini saya membuat sedikit pengubahsuaian dan membahagikan imej kepala kepada komponen Kodnya adalah seperti berikut:
<template> <logo-img /> <hello-world msg="Welcome to Your Vue.js App" /> </template> <script setup> import LogoImg from './components/LogoImg.vue' import HelloWorld from './components/HelloWorld.vue' </script>
Kini kami akan mengubah suai komponen <hello-world>
menjadi komponen tak segerak Kod sampel adalah seperti berikut:
<template> <logo-img /> <hello-world msg="Welcome to Your Vue.js App" /> </template> <script setup> import { defineAsyncComponent } from 'vue' import LogoImg from './components/LogoImg.vue' // 简单用法 const HelloWorld = defineAsyncComponent(() => import('./components/HelloWorld.vue'), ) </script>
Untuk melihat kesannya, kami akan menangguhkan pelaksanaan <. 🎜> di sini, import
contoh Kod adalah seperti berikut:
<script setup> import { defineAsyncComponent } from 'vue' import LogoImg from './components/LogoImg.vue' // 定义一个耗时执行的函数,t 表示延迟的时间, callback 表示需要执行的函数,可选 const time = (t, callback = () => {}) => { return new Promise(resolve => { setTimeout(() => { callback() resolve() }, t) }) } // 定义异步组件,这里这样写是为了查看效果 const HelloWorld = defineAsyncComponent(() => { return new Promise((resolve, reject) => { ;(async function () { try { await time(2000) const res = await import('./components/HelloWorld.vue') resolve(res) } catch (error) { reject(error) } })() }) }) </script>
akan dimuatkan selepas 2 saat. <hello-world>
Kaedah ini juga boleh menerima objek sebagai parameter Objek mempunyai parameter berikut: defineAsyncComponent
: Fungsi kilang yang sama; loader
: Komponen dipaparkan semasa memuatkan komponen tak segerak; Komponen komponen dipaparkan apabila gagal; loadingComponent
: Masa tunda sebelum memaparkan errorComponent
, dalam milisaat, lalai 200 milisaat
delay
: Jika loadingComponent
disediakan dan masa untuk memuatkan komponen melebihi nilai yang ditetapkan, komponen ralat akan dipaparkan. Nilai lalai ialah
dan sentiasa mengawal status pemuatannya sendiri. timeout
timeout
Infinity
, suspensible
dan <Suspense>
4 parameter ini ialah objek Ralat, fungsi dimuat semula. fungsi pemuat tamat, bilangan percubaan semula yang telah dibuat.
Kod berikut menunjukkan penggunaan parameter jenis objek kaedah onError
: error
<template> <logo-img /> <hello-world msg="Welcome to Your Vue.js App" /> </template> <script setup> import { defineAsyncComponent } from 'vue' import LogoImg from './components/LogoImg.vue' import LoadingComponent from './components/loading.vue' import ErrorComponent from './components/error.vue' // 定义一个耗时执行的函数,t 表示延迟的时间, callback 表示需要执行的函数,可选 const time = (t, callback = () => {}) => { return new Promise(resolve => { setTimeout(() => { callback() resolve() }, t) }) } // 记录加载次数 let count = 0 const HelloWorld = defineAsyncComponent({ // 工厂函数 loader: () => { return new Promise((resolve, reject) => { ;(async function () { await time(300) const res = await import('./components/HelloWorld.vue') if (++count < 3) { // 前两次加载手动设置加载失败 reject(res) } else { // 大于3次成功 resolve(res) } })() }) }, loadingComponent: LoadingComponent, errorComponent: ErrorComponent, delay: 0, timeout: 1000, suspensible: false, onError(error, retry, fail, attempts) { // 注意,retry/fail 就像 promise 的 resolve/reject 一样: // 必须调用其中一个才能继续错误处理。 if (attempts < 3) { // 请求发生错误时重试,最多可尝试 3 次 console.log(attempts) retry() } else { fail() } }, }) </script>
retry
fail
Dalam kod di atas, kami akan meminta yang pertama dua kali apabila kita memuatkan Ralat komponen, hanya pemuatan ketiga akan berjaya attempts
Jika pemuatan gagal, komponen akan dipaparkan. Atas ialah kandungan terperinci Cara menggunakan komponen tak segerak defineAsyncComponentAPI dalam Vue3. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!