learn.chetana.fr

Data fetching : useAsyncData, useFetch et le double rendu

12 min readCore

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 + $fetch packagĂ©s — pour appeler une URL directement ;
  • $fetch nu : 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 useAsyncData dans 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.

đŸ§© Quiz1/3

Pourquoi un fetch naĂŻf au setup part-il deux fois en SSR ?

🃏 Flashcards1/4