OUJOOD.COM
Introduction
Dans ce tutoriel, nous allons explorer comment gérer les états asynchrones dans vos applications React. Les états asynchrones sont courants lorsque vous effectuez des opérations comme des appels API, des requêtes réseau, ou des délais. Nous aborderons des techniques comme les Promises, async/await, et l'utilisation des hooks useState et useEffect pour gérer ces états de manière efficace.
Utilisation de Promises avec useState et useEffect
Les Promises sont un moyen courant de gérer des opérations asynchrones en JavaScript. Voici un exemple d'utilisation de Promises avec useState
et useEffect
pour récupérer des données depuis une API :
Composant React pour Récupérer des Données avec Fetch
Ce composant DataFetcher utilise fetch
pour récupérer une liste de publications depuis une API et les afficher dynamiquement.
1. Code du Composant
Le code suivant permet de récupérer et d'afficher une liste de publications en gérant les états de chargement et d'erreur.
import React, { useState, useEffect } from 'react'; function DataFetcher() { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { fetch('https://jsonplaceholder.typicode.com/posts') .then(response => { if (!response.ok) { throw new Error('Erreur réseau'); } return response.json(); }) .then(data => { setData(data); setLoading(false); }) .catch(error => { setError(error.message); setLoading(false); }); }, []); if (loading) return <div>Chargement...</div>; if (error) return <div>Erreur : {error}</div>; return ( <ul> {data.map(post => ( <li key={post.id}>{post.title}</li> ))} </ul> ); } export default DataFetcher;
Explication du code :
useState
gère trois états : données, chargement, et erreur.useEffect
exécute la requêtefetch
au chargement du composant.fetch
récupère les données de l'API et met à jour l'étatdata
.- loading : Affiche Un message de chargement s'affiche tant que les données ne sont pas disponibles.
- En cas d'échec, un message d'erreur est affiché.
3. Utilisation du Composant
Ce composant peut être utilisé dans un projet React comme suit :
import React from 'react'; import DataFetcher from './DataFetcher'; function App() { return ( <div> <h1>Liste des Publications</h1> <DataFetcher /> </div> ); } export default App;
4. Résumé
Ce composant React permet de récupérer et d'afficher des données d'une API externe tout en gérant les erreurs et le chargement.
Utilisation de async/await avec useState et useEffect
L'utilisation de async/await rend le code asynchrone plus lisible et plus facile à gérer. Voici un exemple :
import React, { useState, useEffect } from 'react'; function DataFetcher() { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { try { const response = await fetch('https://jsonplaceholder.typicode.com/posts'); if (!response.ok) { throw new Error('Erreur réseau'); } const result = await response.json(); setData(result); setLoading(false); } catch (error) { setError(error.message); setLoading(false); } }; fetchData(); }, []); if (loading) return <div>Chargement...</div>; if (error) return <div>Erreur : {error}</div>; return ( <ul> {data.map(post => ( <li key={post.id}>{post.title}</li> ))} </ul> ); } export default DataFetcher;
Explication du code :
- async/await : Simplifie la gestion des opérations asynchrones en évitant les chaînes de
.then
. - try/catch : Permet de capturer et de gérer les erreurs de manière structurée.
- fetchData : Une fonction asynchrone qui effectue la requête API et met à jour l'état.
Gestion des états asynchrones avec des hooks personnalisés
Pour simplifier la gestion des états asynchrones, vous pouvez créer un hook personnalisé. Voici un exemple :
import { useState, useEffect } from 'react'; function useAsyncData(url) { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { try { const response = await fetch(url); if (!response.ok) { throw new Error('Erreur réseau'); } const result = await response.json(); setData(result); setLoading(false); } catch (error) { setError(error.message); setLoading(false); } }; fetchData(); }, [url]); return { data, loading, error }; } export default useAsyncData;
Explication du code :
- useAsyncData : Un hook personnalisé qui encapsule la logique de récupération de données asynchrones.
- url : L'URL de l'API à interroger, passée en paramètre.
- return : Retourne un objet contenant les données, l'état de chargement et les erreurs.
Utilisation du hook personnalisé
import React from 'react'; import useAsyncData from './useAsyncData'; function DataFetcher() { const { data, loading, error } = useAsyncData('https://jsonplaceholder.typicode.com/posts'); if (loading) return <div>Chargement...</div>; if (error) return <div>Erreur : {error}</div>; return ( <ul> {data.map(post => ( <li key={post.id}>{post.title}</li> ))} </ul> ); } export default DataFetcher;
Explication du code :
- useAsyncData : Utilise le hook personnalisé pour récupérer les données.
- data, loading, error : Les états retournés par le hook.
Conclusion
Vous avez maintenant une solide compréhension de la gestion des états asynchrones en React. Que ce soit avec des Promises, async/await, ou des hooks personnalisés, ces techniques vous permettront de gérer efficacement les opérations asynchrones dans vos applications.
Pour continuer votre apprentissage, découvrez comment utiliser React.lazy et Suspense pour améliorer les performances de chargement dans le chapitre suivant : React.lazy et Suspense.