Pourquoi mon `useEffect` s'exécute deux fois en développement ?
asked 5 months ago512 viewsfr
Mon useEffect(() => { fetchData(); }, []) est appelé deux fois : je vois deux requêtes dans l'onglet Réseau. C'est un bug ?
AI diagnosis
AI-generated. Not an answer — the community below confirms or corrects it. Always verify before relying on it.
2 Answers
Non, c'est voulu. En mode développement, <StrictMode> monte, démonte puis remonte chaque composant pour vérifier que tes effets se nettoient correctement. En production, l'effet ne s'exécute qu'une fois.
La bonne réaction n'est pas de désactiver StrictMode, mais d'écrire un effet qui supporte ça :
useEffect(() => {
const ctrl = new AbortController();
fetch('/api/data', { signal: ctrl.signal })
.then(r => r.json())
.then(setData)
.catch(e => { if (e.name !== 'AbortError') setError(e); });
return () => ctrl.abort();
}, []);
Encore mieux : pour charger des données, utilise un Server Component (Next.js) ou une bibliothèque comme TanStack Query. Elles gèrent le cache et la déduplication.
Sign in to tell others whether this worked.
Petite précision : si ton effet envoie une mutation (POST), le double appel en dev est un bon signal. Les mutations ne devraient pas partir d'un useEffect au montage, mais d'un gestionnaire d'événement (clic, soumission).
Sign in to tell others whether this worked.
Sign in and verify your email to post an answer.