← Назад к вопросам

В какой Hook подключается REST API

2.2 Middle🔥 201 комментариев
#React#Браузер и сетевые технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

В какой Hook подключается REST API

useEffect — это основной Hook для подключения REST API в React-компонентах. Это хук для работы с побочными эффектами, и загрузка данных из внешних источников является классическим примером такого эффекта.

useEffect для загрузки данных

Когда компонент монтируется (загружается), нужно отправить запрос на сервер. Для этого используется useEffect с пустым массивом зависимостей:

import { useEffect, useState } from "react";

function UserProfile() {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    fetch("/api/user")
      .then(response => response.json())
      .then(json => {
        setData(json);
        setLoading(false);
      })
      .catch(err => {
        setError(err.message);
        setLoading(false);
      });
  }, []); // Пустой массив = выполнится только один раз при монтировании

  if (loading) return <p>Загрузка...</p>;
  if (error) return <p>Ошибка: {error}</p>;
  return <div>{data.name}</div>;
}

Зависимости в useEffect

Массив зависимостей контролирует, когда хук выполняется:

  • Пустой массив [] — выполнится только при монтировании
  • С зависимостями [userId] — выполнится при изменении userId
  • Без массива — выполнится после каждого рендера (редко используется)
function PostList({ userId }) {
  const [posts, setPosts] = useState([]);

  useEffect(() => {
    // Запрос будет переотправляться каждый раз при изменении userId
    fetch(`/api/users/${userId}/posts`)
      .then(res => res.json())
      .then(setPosts);
  }, [userId]); // userId в зависимостях

  return <ul>{posts.map(p => <li key={p.id}>{p.title}</li>)}</ul>;
}

Отмена запросов (AbortController)

Важно отменять запросы, чтобы избежать утечек памяти при размонтировании компонента:

useEffect(() => {
  const controller = new AbortController();

  fetch("/api/data", { signal: controller.signal })
    .then(res => res.json())
    .then(setData)
    .catch(err => {
      if (err.name !== "AbortError") {
        setError(err);
      }
    });

  // Cleanup функция отменяет запрос при размонтировании
  return () => controller.abort();
}, []);

Альтернативный подход: кастомный хук

Для переиспользуемой логики можно создать собственный хук:

function useFetch(url) {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const controller = new AbortController();
    
    fetch(url, { signal: controller.signal })
      .then(res => res.json())
      .then(setData)
      .catch(err => !controller.signal.aborted && setError(err))
      .finally(() => setLoading(false));

    return () => controller.abort();
  }, [url]);

  return { data, loading, error };
}

// Использование
function App() {
  const { data, loading, error } = useFetch("/api/users");
  return loading ? <p>Загрузка...</p> : <div>{JSON.stringify(data)}</div>;
}

Новый подход: React Query или SWR

Для сложных сценариев используют библиотеки:

import useSWR from "swr";

function UserProfile({ userId }) {
  const { data, error, isLoading } = useSWR(`/api/users/${userId}`, fetch);
  
  if (isLoading) return <p>Загрузка...</p>;
  if (error) return <p>Ошибка загрузки</p>;
  return <div>{data.name}</div>;
}

Ключевые моменты

  • useEffect — стандартный Hook для REST API
  • Пустой массив зависимостей — запрос при монтировании
  • AbortController — отмена запросов для избежания утечек
  • Кастомные хуки — переиспользуемая логика
  • React Query/SWR — для сложного управления состоянием данных