Почему useEffect может вызываться два раза в React?
В React 18 в режиме разработки useEffect может вызываться два раза из-за StrictMode. Это сделано специально, чтобы выявлять небезопасные побочные эффекты. В продакшене такого поведения нет. Два вызова помогают обнаружить код, который не готов к повторному выполнению.
StrictMode — это режим React, который помогает находить потенциальные ошибки, намеренно вызывая некоторые операции повторно.
Перед перечислением важно понимать: это не баг, а диагностическое поведение.
React монтирует компонент
Вызывает useEffect
Вызывает cleanup
Монтирует компонент ещё раз
Снова вызывает useEffect
useEffect(() => {
console.log("effect");
return () => {
console.log("cleanup");
};
}, []);
В режиме разработки лог будет:
"effect"
"cleanup"
"effect"
Проверяет, корректно ли работает cleanup
Выявляет:
неотменённые подписки
дублирующиеся запросы
небезопасные побочные эффекты
Заставляет писать устойчивый код
Если запрос:
Делается без cleanup
Не отменяется
Не защищён от race condition
— вы увидите двойной запрос в dev-режиме.
Всегда использовать cleanup
Не полагаться на “однократность” эффекта
Понимать разницу между dev и prod
Двойной вызов useEffect в React — это следствие StrictMode. Он помогает находить ошибки в работе с побочными эффектами и делает код надёжнее.