Récupérer des données
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
$fetchseul 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 :
<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 :
| Valeur | Rôle |
|---|---|
data | Les données reçues (undefined tant qu'il n'y a rien). |
status | 'idle', 'pending', 'success' ou 'error'. |
error | L'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 :
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.
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.
<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.
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
useFetchcharge une adresse,useAsyncDatan'importe quelle fonction : les deux transmettent les données du serveur au navigateur.statuseterrorgèrent l'attente et les erreurs ;refresh()relance.- Passe une fonction en adresse pour qu'elle suive les changements de paramètre.
$fetchpour les clics et les formulaires, jamais seul dans le setup.
Pour aller plus loin
Sources officielles
Ensuite
Les composants
Découper l'interface en composants importés automatiquement, leur passer des données et charger les plus lourds à la demande.
Les routes API
Écrire une petite API dans server/api : lire, créer, renvoyer des erreurs, et garder les secrets côté serveur.
- Projet
- Lignes de code
- Niveau
- Toit-terrasse
- Appartement
- Nuxt
- Pièce
- 5/8
- Plan n°
- nuxt/05.recuperer-des-donnees