Pourquoi mon `useEffect` s'exécute deux fois en développement ?

asked 5 months ago512 viewsfr

4

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.

asked 5 months ago

2 Answers

8
✓
✓ Accepted answer

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.

answered 5 months ago
6

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.

answered 5 months ago

Sign in and verify your email to post an answer.