Progression
0 %
0/32 étapes terminées
Intermédiaire · 10 min de lecture
useEffect sans pièges
Synchroniser, nettoyer, et savoir quand s'en passer
1Définition
useEffect synchronise un composant avec un système extérieur à React : réseau, minuteurs, abonnements, API du téléphone. Il s'exécute après l'affichage.
2Principes fondamentaux
01
Après le rendu
L'effet ne bloque pas l'affichage. Le rendu reste un calcul pur ; les effets gèrent le reste.
02
Les dépendances décrivent la synchronisation
Toute valeur réactive lue dans l'effet (props, état) doit figurer dans le tableau. Le linter react-hooks/exhaustive-deps le vérifie pour toi.
03
Le nettoyage
La fonction renvoyée s'exécute avant chaque nouvelle exécution et à la disparition du composant. En développement, React monte, démonte et remonte une fois pour vérifier que ton nettoyage fonctionne.
04
Tout ne mérite pas un effet
Calculer une valeur à partir de l'état ou réagir à un appui ne nécessite pas d'effet : fais-le pendant le rendu ou dans le gestionnaire d'événement.
3Exemples pratiques
Ignorer une réponse périmée
1useEffect(() => {2 let annule = false;3 4 async function charger() {5 const reponse = await fetch('https://api.exemple.com/villes/' + ville);6 const json = await reponse.json();7 if (!annule) setMeteo(json);8 }9 10 charger();11 return () => {12 annule = true;13 };14}, [ville]);Si l'utilisateur change de ville avant la fin du chargement, l'ancienne réponse est ignorée : pas de données qui s'écrasent dans le désordre.
Un compte à rebours propre
1import { useEffect, useState } from 'react';2import { View, Text } from 'react-native';3 4export default function App() {5 const [reste, setReste] = useState(10);6 7 useEffect(() => {8 if (reste === 0) return;9 const id = setTimeout(() => setReste(reste - 1), 1000);10 return () => clearTimeout(id);11 }, [reste]);12 13 return (14 <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>15 <Text style={{ fontSize: 96, fontWeight: '800', color: reste === 0 ? '#689b34' : '#171718' }}>16 {reste === 0 ? 'GO' : reste}17 </Text>18 </View>19 );20}L'effet dépend de reste : chaque seconde, il se nettoie et se relance, et s'arrête à zéro.
4Erreurs courantes
Un effet pour une valeur calculable
À éviter
const [total, setTotal] = useState(0);useEffect(() => { setTotal(panier.reduce((s, p) => s + p.prix, 0));}, [panier]);À faire
const total = panier.reduce((s, p) => s + p.prix, 0);Pourquoi : L'effet provoque un rendu supplémentaire, et une valeur intermédiaire incorrecte s'affiche brièvement.
Oublier une dépendance
À éviter
useEffect(() => { charger(idUtilisateur);}, []);À faire
useEffect(() => { charger(idUtilisateur);}, [idUtilisateur]);Pourquoi : Si l'utilisateur change, l'écran affiche encore les données de l'ancien.
Oublier de se désabonner
À éviter
useEffect(() => { const sub = Keyboard.addListener('keyboardDidShow', ouvrir);}, []);À faire
useEffect(() => { const sub = Keyboard.addListener('keyboardDidShow', ouvrir); return () => sub.remove();}, []);Pourquoi : Chaque montage ajoute un écouteur qui ne disparaît jamais.
5Subtilités à connaître
- ◆Une fonction ou un objet créé pendant le rendu change à chaque rendu : mis en dépendance, il relance l'effet en boucle. Déplace-le dans l'effet ou stabilise-le.
- ◆
useLayoutEffects'exécute avant que l'écran ne soit peint : réservé aux mesures de mise en page. - ◆Pour les données serveur, une bibliothèque comme TanStack Query gère cache, annulation et rechargement mieux qu'un effet écrit à la main.
6Vérifie ta compréhension
Question 1/3
Score 0
Quand s'exécute la fonction de nettoyage ?
Envie d'essayer ? Ouvre le Labo et recopie les exemples pour les modifier.