Data fetching : useAsyncData, useFetch et le double rendu
Le problÚme que les composables de fetch résolvent
En SSR, un fetch naĂŻf au setup partirait deux fois (serveur puis client Ă l'hydratation) â double appel, flash de contenu. Les composables Nuxt rĂšglent ça :
const { data: course } = await useAsyncData(
`course:${slug}`, // â la CLĂ : identifie la donnĂ©e
() => queryContent(`/courses/${slug}`).find(),
)
Le mĂ©canisme : exĂ©cutĂ© sur le serveur, le rĂ©sultat est sĂ©rialisĂ© dans le payload de la page ; Ă l'hydratation, le client rĂ©utilise ce payload au lieu de re-fetcher. La clĂ© est ce qui permet la rĂ©conciliation â deux appels avec la mĂȘme clĂ© partagent la mĂȘme donnĂ©e (on s'en sert sur cette plateforme : useCourse est appelĂ© par la page sommaire ET la page leçon, un seul fetch).
Les rĂšgles d'usage
useFetch(url)=useAsyncData+$fetchpackagĂ©s â pour appeler une URL directement ;$fetchnu : pour les actions (POST au clic, mutations) â pas de double-rendu Ă gĂ©rer puisque dĂ©clenchĂ© cĂŽtĂ© client ;- le retour est riche :
{ data, status, error, refresh }ârefresh()re-exĂ©cute (aprĂšs une mutation, par exemple) ; - le piĂšge n°1 : appeler
useAsyncDatadans une fonction ou un handler â comme tout composable, il vit au setup. Pour un fetch au clic :$fetch; - le piĂšge n°2 : oublier
awaitâ la page se rend avant les donnĂ©es (data vaut null au premier rendu serveur).
OĂč mettre la logique : le composable de donnĂ©es
Le pattern de cette plateforme (et du projet copilot) : envelopper useAsyncData dans un composable mĂ©tier (useCourse(slug), useCatalog()) â la page ne connaĂźt ni la clĂ©, ni la source (Content, API, BFF), juste le contrat. Changer la source de donnĂ©es = changer le composable, zĂ©ro page touchĂ©e.
Pourquoi un fetch naĂŻf au setup part-il deux fois en SSR ?