Asenkron Bileşenler
Asenkron Bileşenler
Temel Kullanım
Büyük uygulamalarda, uygulamayı daha küçük parçalara ayırmamız ve yalnızca ihtiyaç duyulduğunda sunucudan bir bileşeni yüklememiz gerekebilir. Bunu mümkün kılmak için Vue, defineAsyncComponent
fonksiyonunu sunar:
import { defineAsyncComponent } from 'vue'
const AsyncComp = defineAsyncComponent(() => {
return new Promise((resolve, reject) => {
// ... bileşeni sunucudan yükle
resolve(/* yüklenmiş bileşen */)
})
})
// ... `AsyncComp`'i normal bir bileşen gibi kullan
Gördüğünüz gibi, defineAsyncComponent
, bir Promise döndüren bir yükleyici fonksiyonu kabul eder. Promise'in resolve
geri çağrısı, bileşen tanımınızı sunucudan aldığınızda çağrılmalıdır. Yüklemenin başarısız olduğunu belirtmek için reject(reason)
çağrısını da yapabilirsiniz.
ES modül dinamik içe aktarma de bir Promise döndürür, bu nedenle çoğu zaman bunu defineAsyncComponent
ile birlikte kullanacağız. Vite ve webpack gibi paketleyiciler de bu söz dizimini destekler (ve bundle bölme noktaları olarak kullanır), bu nedenle Vue SFC'lerini içe aktarmak için bunu kullanabiliriz:
import { defineAsyncComponent } from 'vue'
const AsyncComp = defineAsyncComponent(() =>
import('./components/MyComponent.vue')
)
Sonuç olarak AsyncComp
, yalnızca sayfada gerçekten render edildiğinde yükleyici fonksiyonunu çağıran bir sargı bileşenidir. Ayrıca, herhangi bir props ve slot'u iç bileşene iletecektir, böylece asenkron sargıyı kullanarak orijinal bileşeni sorunsuz bir şekilde değiştirebilir ve tembel yükleme elde edebilirsiniz.
Normal bileşenler gibi, asenkron bileşenler de küresel olarak kaydedilebilir
app.component()
kullanılarak:
app.component('MyComponent', defineAsyncComponent(() =>
import('./components/MyComponent.vue')
))
Options API Kullanımı
Ayrıca, bir bileşen yerel olarak kaydedilirken
defineAsyncComponent
kullanabilirsiniz:
<script>
import { defineAsyncComponent } from 'vue'
export default {
components: {
AdminPage: defineAsyncComponent(() =>
import('./components/AdminPageComponent.vue')
)
}
}
</script>
<template>
<AdminPage />
</template>
Composition API Kullanımı
Ayrıca, ebeveyn bileşenin içinde doğrudan tanımlanabilirler:
<script setup>
import { defineAsyncComponent } from 'vue'
const AdminPage = defineAsyncComponent(() =>
import('./components/AdminPageComponent.vue')
)
</script>
<template>
<AdminPage />
</template>
Yükleme ve Hata Durumları
Asenkron işlemler kaçınılmaz olarak yükleme ve hata durumlarını içerir - defineAsyncComponent()
bu durumları gelişmiş seçenekler aracılığıyla yönetmeyi destekler:
const AsyncComp = defineAsyncComponent({
// yükleyici fonksiyon
loader: () => import('./Foo.vue'),
// asenkron bileşen yüklenirken kullanılacak bir bileşen
loadingComponent: LoadingComponent,
// yükleme bileşeninin gösterilmesinden önceki gecikme. Varsayılan: 200ms.
delay: 200,
// yükleme başarısız olursa kullanılacak bir bileşen
errorComponent: ErrorComponent,
// zaman aşımı sağlanırsa ve aşıldıysa hata bileşeni gösterilecektir.
// Varsayılan: Sonsuz.
timeout: 3000
})
Eğer bir yükleme bileşeni sağlanmışsa, iç bileşen yüklenirken önce o gösterilecektir. Yükleme bileşeninin gösterilmesinden önce varsayılan olarak 200ms'lik bir gecikme vardır - bu, hızlı ağlarda anlık yükleme durumunun çok hızlı bir şekilde değişmesi ve titreme gibi görünmesi nedeniyle yapılmıştır.
Eğer bir hata bileşeni sağlanmışsa, yükleyici fonksiyondan dönen Promise reddedildiğinde gösterilecektir. İsteğin çok uzun sürmesi durumunda hata bileşenini göstermek için bir zaman aşımı belirtebilirsiniz.
Tembel Hidrasyon
Bu bölüm yalnızca
Sunucu Taraflı Rendering
kullanıyorsanız geçerlidir.
Vue 3.5+ sürümlerinde, asenkron bileşenler bir hidrasyon stratejisi sağlayarak ne zaman hidratlandıklarını kontrol edebilirler.
Vue, birkaç yerleşik hidrasyon stratejisi sunar. Bu yerleşik stratejilerin kullanılmadıklarında ağaç sarsak için ayrı ayrı içe aktarılması gerekir.
Tasarım, esneklik sağlamak için kasıtlı olarak düşük seviyelidir. Derleyici söz dizimi şekilleri gelecekte ya çekirdek ya da daha yüksek seviyeli çözümler (örn. Nuxt) üzerine inşa edilebilir.
Boşta Hidrasyon
requestIdleCallback
aracılığıyla hidrasyon:
import { defineAsyncComponent, hydrateOnIdle } from 'vue'
const AsyncComp = defineAsyncComponent({
loader: () => import('./Comp.vue'),
hydrate: hydrateOnIdle(/* isteğe bağlı olarak maksimum zaman aşımını geçebilirsiniz */)
})
Görünürken Hidrasyon
IntersectionObserver
aracılığıyla element(ler) görünür olduğunda hidrasyon.
import { defineAsyncComponent, hydrateOnVisible } from 'vue'
const AsyncComp = defineAsyncComponent({
loader: () => import('./Comp.vue'),
hydrate: hydrateOnVisible()
})
Gözlemci için opsiyonel olarak bir nesne değeri geçebilirsiniz:
hydrateOnVisible({ rootMargin: '100px' })
Medya Sorgusu ile Hidrasyon
Belirtilen medya sorgusu eşleştiğinde hidrasyon.
import { defineAsyncComponent, hydrateOnMediaQuery } from 'vue'
const AsyncComp = defineAsyncComponent({
loader: () => import('./Comp.vue'),
hydrate: hydrateOnMediaQuery('(max-width:500px)')
})
Etkileşim ile Hidrasyon
Belli bir olay(lar) bileşen element(ler) üzerinde tetiklendiğinde hidrasyon. Hidrasyon tamamlandığında tetikleyen olay da tekrar oynatılacaktır.
import { defineAsyncComponent, hydrateOnInteraction } from 'vue'
const AsyncComp = defineAsyncComponent({
loader: () => import('./Comp.vue'),
hydrate: hydrateOnInteraction('click')
})
Ayrıca birden fazla olay türü listesi de olabilir:
hydrateOnInteraction(['wheel', 'mouseover'])
Özel Strateji
import { defineAsyncComponent, type HydrationStrategy } from 'vue'
const myStrategy: HydrationStrategy = (hydrate, forEachElement) => {
// forEachElement, bileşenin hidratlanmamış DOM'undaki tüm kök elementleri
// yinelemek için bir yardımcıdır, çünkü kök bir parça yerine
// tek bir element olabilir
forEachElement(el => {
// ...
})
// hazır olduğunda `hydrate` çağrısını yap
hydrate()
return () => {
// gerekirse bir kaldırma fonksiyonu döndür
}
}
const AsyncComp = defineAsyncComponent({
loader: () => import('./Comp.vue'),
hydrate: myStrategy
})
Suspense ile Kullanım
Asenkron bileşenler, yerleşik bileşeni ile birlikte kullanılabilir.
ve asenkron bileşenler arasındaki etkileşim için özel bölümde
belgelenmiştir.