L'Architecture en Microservices : Approfondissement et Schémas
Pourquoi passer d'un monolithe Ă une structure en microservice ?
Pourquoi j'ai une boucle infinie dans mon useEffect ?
useEffect
peut provoquer une boucle infinieLorsque vous travaillez avec React, il est fréquent d'utiliser le hook useEffect
pour gérer des effets secondaires tels que :
Cependant, lâajout de certaines dĂ©pendances dans le tableau de dĂ©pendances de useEffect
, comme recommandé par le linter, peut parfois conduire à une boucle infinie.
Cet article explique pourquoi cela se produit et comment Ă©viter ce problĂšme.
useEffect
useEffect
est utilisé pour exécuter du code aprÚs le rendu du composant. Vous pouvez le configurer pour s'exécuter uniquement lors du premier rendu (en fournissant une liste de dépendances vide), ou chaque fois que certaines variables changent.
Voici la structure générale de useEffect
:
useEffect(() => { Â
// Code à exécuter
}, [dépendances]);
â
Le tableau des dĂ©pendances dĂ©termine quand l'effet doit ĂȘtre exĂ©cutĂ© :
[]
), lâeffet ne sâexĂ©cute quâune seule fois đ.[var1, var2]
), lâeffet sâexĂ©cutera chaque fois que l'une de ces variables change đ.Les linters, comme ESLint, suggĂšrent souvent dâajouter des variables utilisĂ©es dans votre useEffect
pour garantir que l'effet reflÚte correctement les changements de ces variables. Cela permet de maintenir le code cohérent et à jour.
Cependant, suivre aveuglĂ©ment ces recommandations peut parfois provoquer des boucles infinies, oĂč useEffect
est ré-exécuté sans cesse.
Mais alors au lieu de juste faire ça :
useEffect(() => {
setSelected(defaultValue);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [defaultValue]);
.......si si, on vous voit đ
Essayons de comprendre, au moins en surface, pourquoi j'ai une boucle infinie et comment l'Ă©viter.
En React, les fonctions et objets dĂ©finis Ă l'intĂ©rieur d'un composant sont recrĂ©Ă©s Ă chaque rendu. Si vous les incluez comme dĂ©pendances, lâeffet sera rĂ©-exĂ©cutĂ© sans cesse, car la rĂ©fĂ©rence change constamment.
Exemple problĂ©matique :â
const Component = () => {
const [count, setCount] = useState(0);
const doSomething = () => {
console.log('Doing something');
};
useEffect(() => {
doSomething();
}, [doSomething]); // â ïž ProblĂšme : `doSomething` est recrĂ©Ă©e Ă chaque rendu, boucle infinie};
return <div>{count}</div>;
};
â
useEffect
Mettre Ă jour un Ă©tat avec setState
dans un useEffect
déclenche un nouveau rendu. Si cet état est inclus dans la liste des dépendances, cela provoque une boucle infinie, car le rendu relance l'effet, qui à son tour modifie l'état.
Exemple :
const Component = () => {
const [data, setData] = useState(null);
useEffect(() => {
// Simuler une requĂȘte API
fetchData().then((response) => {
setData(response);
});
}, [data]); // â ïž Boucle infinie : `data` est rĂ©actualisĂ©e Ă chaque rendu};
return <div>{count}</div>;
};
ââ
useCallback
ou useMemo
pour stabiliser les référencesUtilisez useCallback
pour stabiliser une fonction ou useMemo
pour stabiliser un objet, afin d'éviter qu'ils soient recréés à chaque rendu.
const Component = () => {
const [count, setCount] = useState(0);
const doSomething = useCallback(() => {
console.log("Doing something");
}, []); // đ ïž Fonction mĂ©morisĂ©e
useEffect(() => {
doSomething();
}, [doSomething]);
};
â
useEffect
Ăvitez d'inclure des Ă©tats qui sont mis Ă jour par lâeffet dans la liste des dĂ©pendances, sauf si c'est absolument nĂ©cessaire.â
const Component = () => {
const [data, setData] = useState(null);
useEffect(() => {
fetchData().then(response => {
setData(response);
});
}, []); // â
Ne pas inclure `data` pour Ă©viter la boucle
};
â
Assurez-vous que l'effet doit réellement se déclencher à chaque changement de certaines variables. Sinon, ajustez la liste des dépendances pour n'inclure que les variables nécessaires.
useEffect
Ajoutez des conditions dans votre effet pour contrĂŽler son exĂ©cution.â
useEffect(() => {
if (condition) {
// Code exécuté uniquement si la condition est vraie
}
}, [dépendances]);
â
Les boucles infinies dans useEffect
proviennent souvent de dĂ©pendances instables (comme des fonctions ou des objets recrĂ©Ă©s Ă chaque rendu) ou de la mise Ă jour dâĂ©tats surveillĂ©s inutilement. Pour Ă©viter ces erreurs tout en respectant les recommandations du linter, stabilisez vos rĂ©fĂ©rences avec useCallback
ou useMemo
, et gérez soigneusement vos dépendances dans useEffect
.
â