> Насколько хорошей практикой является вызов fetch внутри useEffect в React (React)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: циан

Стек: React

> Пример ответа

Вызов fetch внутри useEffect - это распространённая и допустимая практика в React для выполнения побочных эффектов, таких как загрузка данных. Однако важно учитывать несколько нюансов, чтобы избежать типичных проблем.

Плюсы:

  • Соответствует архитектуре React: useEffect предназначен для синхронизации компонента с внешними системами (API, DOM, таймеры).

  • Позволяет легко управлять жизненным циклом запроса (например, отмена при размонтировании компонента).

Минусы и рекомендации:

  1. Гонка состояний (race conditions): Если компонент быстро перерендеривается (например, при изменении зависимостей), старый запрос может завершиться после нового, перезаписав актуальные данные. Решение: используйте флаг отмены (например, AbortController) или проверяйте актуальность через замыкание.

  2. Чистота эффекта: Всегда возвращайте функцию очистки, чтобы отменять запросы при размонтировании или повторном вызове эффекта.

  3. Избегайте async внутри useEffect напрямую: Функция эффекта не должна быть асинхронной. Вместо этого определите асинхронную функцию внутри и вызовите её.

Пример хорошей реализации:

JSX
useEffect(() => {
const controller = new AbortController();
const fetchData = async () => {
try {
const response = await fetch('/api/data', { signal: controller.signal });
const data = await response.json();
setData(data);
} catch (error) {
if (error.name !== 'AbortError') {
setError(error);
}
}
};
fetchData();
return () => controller.abort();
}, [dependency]);

Когда это не лучшая практика:

  • Для сложной логики управления состоянием запросов (кэширование, повторные попытки, дедупликация) лучше использовать библиотеки вроде React Query, SWR или RTK Query. Они инкапсулируют эти паттерны и уменьшают шаблонный код.

  • Если данные нужны при монтировании приложения (например, конфигурация), рассмотрите загрузку вне компонента или в корневом layout.

Итог: Вызов fetch в useEffect - нормальная практика для простых случаев, но требует аккуратности с отменой запросов и обработкой ошибок. Для продакшн-приложений с множеством запросов предпочтительнее специализированные решения.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью