Toit-terrasseN NuxtPièce 5/8Intermédiaire

Récupérer des données

Charger des données avec useFetch, gérer le chargement et les erreurs, et savoir quand utiliser $fetch.

Ce que tu vas apprendre

  • Charger la liste des recettes avec useFetch.
  • Afficher un état de chargement et une erreur.
  • Ce qui se passe entre le navigateur et le serveur, étape par étape.
  • Pourquoi $fetch seul dans le setup est un piège, et où l'utiliser.

Charger la liste avec useFetch

Ta page /recettes doit afficher les recettes fournies par l'API /api/recettes (tu l'écriras au chapitre suivant). Une ligne suffit :

app/pages/recettes/index.vue
<script setup lang="ts">
const { data: recettes, status, error, refresh } = await useFetch('/api/recettes')
</script>

<template>
  <p v-if="status === 'pending'">Chargement...</p>
  <p v-else-if="error">Impossible de charger les recettes.</p>
  <ul v-else>
    <li v-for="r in recettes" :key="r.id">
      <NuxtLink :to="`/recettes/${r.id}`">{{ r.titre }}</NuxtLink>
    </li>
  </ul>
  <button @click="refresh()">Actualiser</button>
</template>

useFetch renvoie plusieurs choses utiles :

ValeurRôle
dataLes données reçues (undefined tant qu'il n'y a rien).
status'idle', 'pending', 'success' ou 'error'.
errorL'erreur, s'il y en a une.
refresh()Relance la requête.

Ce qui se passe vraiment

Au premier chargement, la page est fabriquée sur le serveur. useFetch y appelle l'API, puis le serveur envoie au navigateur le HTML et les données. Lance l'animation pour suivre la requête :

Premier chargement avec useFetch

Navigateur

Serveur Nuxt

server/api + base

Lance l’animation pour suivre la requête étape par étape.

Quand tu cliques ensuite sur un <NuxtLink>, tout se passe dans le navigateur : seules les données voyagent.

Navigation vers une autre page

Navigateur

Serveur Nuxt

server/api + base

Lance l’animation pour suivre la requête étape par étape.

Une adresse qui change

Sur la page d'une recette, l'adresse de l'API dépend du paramètre id. Passe une fonction plutôt qu'un texte : useFetch relance la requête quand la valeur change.

app/pages/recettes/[id].vue
<script setup lang="ts">
const route = useRoute()
const { data: recette } = await useFetch(() => `/api/recettes/${route.params.id}`)
</script>

Tu peux aussi envoyer des paramètres d'adresse avec l'option query : useFetch('/api/recettes', { query: { categorie: 'dessert' } }) appelle /api/recettes?categorie=dessert.

useAsyncData : pour tout le reste

useFetch sert à appeler une adresse. Pour une autre source (une bibliothèque comme le client Supabase, un calcul), utilise useAsyncData. Il fonctionne de la même façon : données transmises du serveur au navigateur, status, error, refresh.

const { data: recettes } = await useAsyncData('recettes', () => client.from('recettes').select())

Le premier argument est une clé qui identifie la donnée. En réalité, useFetch est un raccourci pour useAsyncData + $fetch.

Le piège de $fetch

$fetch envoie une requête, tout simplement. Mais placé seul dans le <script setup> d'une page, il s'exécute deux fois : une fois sur le serveur, une fois dans le navigateur, car il ne transmet pas son résultat.

Le piège : $fetch seul dans le setup

Navigateur

Serveur Nuxt

server/api + base

Lance l’animation pour suivre la requête étape par étape.

$fetch reste le bon outil pour les actions déclenchées par l'utilisateur, comme l'envoi d'un formulaire :

async function ajouterRecette(nouvelle: { titre: string, duree: number }) {
  await $fetch('/api/recettes', { method: 'POST', body: nouvelle })
  await refresh() // recharge la liste
}
data ne suit pas les modifications à l'intérieur de l'objet. Pour changer une recette affichée, remplace la valeur entière (data.value = { ...data.value, titre: 'Nouveau titre' }) ou recharge avec refresh().

À retenir

  • useFetch charge une adresse, useAsyncData n'importe quelle fonction : les deux transmettent les données du serveur au navigateur.
  • status et error gèrent l'attente et les erreurs ; refresh() relance.
  • Passe une fonction en adresse pour qu'elle suive les changements de paramètre.
  • $fetch pour les clics et les formulaires, jamais seul dans le setup.

Pour aller plus loin

Sources officielles

Ensuite

Projet
Lignes de code
Niveau
Toit-terrasse
Appartement
Nuxt
Pièce
5/8
Plan n°
nuxt/05.recuperer-des-donnees
Lignes de code · fiches rédigées à partir des documentations officielles, sources citées en bas de chaque page.