SSR with Nuxt 3
Thème :
Junior
1 vues ·4/9 leçonsuseFetch et useAsyncData : La Récupération de Données SSR-Ready
Nuxt fournit des composables pour récupérer des données qui fonctionnent parfaitement avec le SSR. Fini les appels API qui échouent côté serveur !
useFetch : La Méthode Principale
<script setup>
// Récupère côté serveur ET côté client, sans doublon !
const { data, pending, error, refresh } = await useFetch('/api/users');
</script>
<template>
<div v-if="pending">Chargement...</div>
<div v-else-if="error">Erreur : {{ error.message }}</div>
<ul v-else>
<li v-for="user in data" :key="user.id">{{ user.name }}</li>
</ul>
</template>
Les Options de useFetch
<script setup>
const { data } = await useFetch('/api/users', {
// Méthode HTTP
method: 'POST',
// Corps de la requête
body: { name: 'Jean' },
// Paramètres de query (?page=1&limit=10)
query: { page: 1, limit: 10 },
// Headers
headers: { Authorization: 'Bearer token' },
// Transformer la réponse
transform: (response) => response.data,
// Ne choisir que certains champs
pick: ['id', 'name', 'email'],
// Valeur par défaut (évite le null initial)
default: () => [],
// Clé de cache
key: 'users-list',
// Serveur uniquement (pas de fetch côté client)
server: true,
// Lazy (ne bloque pas la navigation)
lazy: true,
// Immédiat (fetch au montage)
immediate: true,
// Re-fetche quand ces refs changent
watch: [page, filter],
});
</script>
useAsyncData : Pour les Opérations Async Personnalisées
<script setup>
const { data: user } = await useAsyncData('user', () => {
return $fetch(`/api/users/${route.params.id}`);
});
// Avec options
const { data: posts } = await useAsyncData('posts', () => fetchPosts(), {
transform: (posts) => posts.filter((p) => p.published),
default: () => [],
});
</script>
Le Lazy Fetching (Ne Pas Bloquer La Navigation)
<script setup>
// useLazyFetch - ne bloque PAS la navigation
const { data, pending } = useLazyFetch('/api/posts');
// useLazyAsyncData
const { data: comments } = useLazyAsyncData('comments', fetchComments);
</script>
<template>
<div v-if="pending">Chargement des posts...</div>
<PostList v-else :posts="data" />
</template>
Rafraîchir les Données
<script setup>
const { data, refresh, pending } = await useFetch('/api/users');
// Rafraîchissement manuel
async function handleRefresh() {
await refresh();
}
// Vider le cache et re-fetcher
await refresh({ dedupe: true });
</script>
<template>
<button @click="handleRefresh" :disabled="pending">
{{ pending ? 'Rafraîchissement...' : 'Rafraîchir' }}
</button>
</template>
Surveiller les Changements
<script setup>
const page = ref(1);
const category = ref('all');
const { data: products } = await useFetch('/api/products', {
query: { page, category },
// Re-fetche automatiquement quand ces refs changent
watch: [page, category],
});
</script>
<template>
<select v-model="category">
<option value="all">Tout</option>
<option value="electronics">Électronique</option>
</select>
<button @click="page++">Page Suivante</button>
</template>
La Gestion d’Erreurs
<script setup>
const { data, error } = await useFetch('/api/users');
if (error.value) {
// Lancer une erreur Nuxt (affiche la page d'erreur)
throw createError({
statusCode: 404,
message: 'Utilisateurs introuvables',
});
}
</script>
<template>
<div v-if="error">
<h2>Erreur</h2>
<p>{{ error.message }}</p>
<pre>{{ error.data }}</pre>
</div>
</template>
$fetch : Pour les Appels Non-Réactifs
<script setup>
// Pour des event handlers ou des besoins non-réactifs
async function createUser(userData: UserData) {
const user = await $fetch('/api/users', {
method: 'POST',
body: userData
})
return user
}
async function deleteUser(id: number) {
await $fetch(`/api/users/${id}`, {
method: 'DELETE'
})
}
</script>
Le Cache
<script setup>
// Même clé = données partagées (cache)
const { data: user1 } = await useFetch('/api/user/1', { key: 'user-1' });
const { data: user2 } = await useFetch('/api/user/1', { key: 'user-1' });
// user1 et user2 partagent les mêmes données en cache
// Forcer un fetch frais (bypass du cache)
const { data: freshUser } = await useFetch('/api/user/1', {
key: 'user-1-fresh',
getCachedData: () => null, // Ignore le cache
});
</script>
Les Grimoires De Tests
📘 Cette leçon fait partie du cours Vue SSR & Nuxt sur la plateforme d’apprentissage RostoDev.
Prêt à passer à la suite ?
Vous avez terminé cette leçon sur `useFetch` et `useAsyncData` : La Récupération de Données SSR-Ready. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.