Synchronisez vos composants avec le monde extérieur grâce à useEffect, en maîtrisant les dépendances et le nettoyage.
Ouvrir cette leçon dans KodokonUn composant React calcule du JSX à partir de props et d'état. Tout ce qui sort de ce cadre - modifier le titre du document, lancer un minuteur, s'abonner à un événement du navigateur - est un effet de bord. useEffect exécute ce code après le rendu, sans bloquer l'affichage, et le resynchronise quand certaines valeurs changent.
import { useEffect } from "react";
function CartTitle({ count }) {
useEffect(() => {
document.title = `Panier (${count})`;
}, [count]);
return <p>Articles : {count}</p>;
}Le tableau de dépendances pilote la fréquence d'exécution. [count] : l'effet se rejoue après chaque rendu où count a changé. [] : l'effet ne s'exécute qu'une fois, après le premier rendu. Tableau absent : l'effet se rejoue après chaque rendu, ce qui est rarement souhaitable. Règle d'or : toute valeur du composant utilisée dans l'effet doit figurer dans le tableau.
import { useEffect, useState } from "react";
function Timer() {
const [seconds, setSeconds] = useState(0);
useEffect(() => {
const id = setInterval(() => {
setSeconds((s) => s + 1);
}, 1000);
return () => clearInterval(id);
}, []);
return <p>Écoulé : {seconds} s</p>;
}La fonction retournée par l'effet est la fonction de nettoyage. React l'appelle avant chaque nouvelle exécution de l'effet, puis une dernière fois au démontage du composant. C'est elle qui évite les fuites : minuteurs orphelins, écouteurs empilés, abonnements jamais résiliés. Chaque effet qui « ouvre » quelque chose doit le refermer.
useEffect(() => {
function onResize() {
setWidth(window.innerWidth);
}
window.addEventListener("resize", onResize);
return () => {
window.removeEventListener("resize", onResize);
};
}, []);useEffect(fn, []), quand la fonction fn est-elle exécutée ?userId mais son tableau de dépendances est []. Quel est le problème ?