Pourquoi mon `useEffect` s'exécute deux fois en développement ?
posée 5 months ago512 vuesfr
Mon useEffect(() => { fetchData(); }, []) est appelé deux fois : je vois deux requêtes dans l'onglet Réseau. C'est un bug ?
Diagnostic IA
Généré par IA. Ce n'est pas une réponse — la communauté ci-dessous le confirme ou le corrige. Vérifiez toujours avant de vous y fier.
2 réponses
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.
Connectez-vous pour dire si ça a marché.
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).
Connectez-vous pour dire si ça a marché.
Sign in and verify your email to post an answer.