0Pricing
Frontend Academy · Урок

SWR и React Query для кэширования данных

Используйте SWR или TanStack Query для получения, кэширования, дедупликации и повторной проверки данных сервера, заменив ручные шаблоны получения данных через useEffect

«SWR и React Query для кэширования данных» — бесплатный урок Frontend Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Frontend Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Frontend Academy содержит 4 уроков всего.

Состояние сервера — это другое

Сетевые данные — это не просто обычное состояние. Для них нужны кэширование, устранение дубликатов, обновление в фоновом режиме, отслеживание загрузки и ошибок, а также повторные попытки. Ручные шаблоны загрузки данных с помощью useEffect + useState плохо воспроизводят эти возможности.

SWR и TanStack Query

SWR (Vercel): небольшой и простой, только хуки. TanStack Query (ранее React Query): более крупный и функциональный, с поддержкой мутаций, бесконечных списков, предварительной загрузки и инструментов разработчика. Оба варианта превосходны.

SWR — базовое использование

useSWR(key, fetcher) возвращает данные, ошибку и состояние загрузки. Данные кэшируются по ключу, а дубликаты запросов устраняются между компонентами.

import useSWR from 'swr';

const fetcher = (url) => fetch(url).then(r => r.json());

function Profile() {
  const { data, error, isLoading } = useSWR('/api/me', fetcher);

  if (error) return <ErrorMessage error={error} />;
  if (isLoading) return <Spinner />;
  return <h1>{data.name}</h1>;
}

SWR — поведение при повторной проверке

По умолчанию SWR повторно проверяет данные при focus (когда вкладка снова получает focus) и после восстановления соединения. Он сразу возвращает кэшированное значение («устаревшее»), а затем обновляет его в фоновом режиме («с повторной проверкой»).

SWR — изменение данных

mutate(key) повторно проверяет кэшированный запрос. Передайте новые данные вторым аргументом, чтобы выполнить оптимистичное обновление.

import useSWR, { mutate } from 'swr';

async function updateProfile(updates) {
  // Optimistic update — UI reflects change immediately
  mutate('/api/me', { ...currentData, ...updates }, false);
  await fetch('/api/me', { method: 'PUT', body: JSON.stringify(updates) });
  // Revalidate to get the server's canonical state
  mutate('/api/me');
}

TanStack Query — настройка

Оберните приложение в QueryClientProvider с настроенным QueryClient.

import { QueryClient, QueryClientProvider } from '@tanstack/react-query';

const client = new QueryClient({
  defaultOptions: {
    queries: { staleTime: 30000, retry: 2 }
  }
});

function App() {
  return (
    <QueryClientProvider client={client}>
      <Routes />
    </QueryClientProvider>
  );
}

useQuery

useQuery({ queryKey, queryFn }) загружает данные и кэширует их.

import { useQuery } from '@tanstack/react-query';

function UserList() {
  const { data, isLoading, error } = useQuery({
    queryKey: ['users'],
    queryFn: () => fetch('/api/users').then(r => r.json()),
    staleTime: 60_000 // fresh for 1 minute
  });

  if (isLoading) return <Spinner />;
  if (error) return <ErrorMessage error={error} />;
  return <ul>{data.map(u => <li key={u.id}>{u.name}</li>)}</ul>;
}

useMutation для записи данных

useMutation обрабатывает POST/PUT/DELETE, предоставляя встроенное состояние выполнения и ошибки, а также обработчик onSuccess для очистки кэшей.

import { useMutation, useQueryClient } from '@tanstack/react-query';

function CreateUserForm() {
  const qc = useQueryClient();
  const m = useMutation({
    mutationFn: (user) => fetch('/api/users', { method: 'POST', body: JSON.stringify(user) }),
    onSuccess: () => qc.invalidateQueries({ queryKey: ['users'] })
  });

  return <button onClick={() => m.mutate({ name: 'Alice' })} disabled={m.isPending}>Create</button>;
}

Инвалидация запросов

После мутации помечайте связанные запросы недействительными, чтобы запустить повторную загрузку. queryClient.invalidateQueries({ queryKey: ['users'] }) помечает их как устаревшие и повторно загружает, если они подключены.

Оптимистичные обновления

TanStack Query полноценно поддерживает оптимистичные обновления через onMutate, onError и onSettled.

useMutation({
  mutationFn: updateUser,
  onMutate: async (newUser) => {
    await qc.cancelQueries({ queryKey: ['user', newUser.id] });
    const previous = qc.getQueryData(['user', newUser.id]);
    qc.setQueryData(['user', newUser.id], newUser);
    return { previous };
  },
  onError: (_, newUser, ctx) => {
    qc.setQueryData(['user', newUser.id], ctx.previous); // rollback
  },
  onSettled: (_, __, newUser) => {
    qc.invalidateQueries({ queryKey: ['user', newUser.id] });
  }
});

Бесконечные запросы

useInfiniteQuery обрабатывает списки с постраничной загрузкой и бесконечной прокруткой: предоставляет fetchNextPage и отслеживает все загруженные страницы.

Инструменты разработчика React Query

Добавьте @tanstack/react-query-devtools, чтобы получить плавающую панель со всеми кэшированными запросами и их состоянием, а также возможность вручную помечать их недействительными.

Быстрая проверка

В чём главное преимущество SWR или TanStack Query по сравнению с ручным использованием useEffect и fetch?

Итоги: SWR и React Query

Состоянию сервера нужны кэширование, устранение дубликатов и повторная проверка. SWR — небольшой и простой. TanStack Query предоставляет больше возможностей: мутации, бесконечные списки и инструменты разработчика. useQuery используется для чтения, useMutation — для записи. После мутаций применяйте invalidateQueries. Оптимистичные обновления выполняются с помощью onMutate/onError. Оба решения делают ручное сочетание useEffect и Fetch ненужным в рабочих приложениях.

Часто задаваемые вопросы

Урок «SWR и React Query для кэширования данных» бесплатный?

Да — полный текст урока «SWR и React Query для кэширования данных» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Frontend Academy, подпишись на CoddyKit PRO. Курс Frontend Academy содержит 4 уроков всего.

Чему я научусь в уроке «SWR и React Query для кэширования данных»?

Используйте SWR или TanStack Query для получения, кэширования, дедупликации и повторной проверки данных сервера, заменив ручные шаблоны получения данных через useEffect Ты практикуешь Frontend Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Frontend Academy?

Предыдущий опыт не требуется. Frontend Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «SWR и React Query для кэширования данных»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Frontend Academy?

Да. Каждый урок Frontend Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Fetch API: GET, POST, PUT и DELETE
  2. Axios: перехватчики и базовый URL
  3. Обработка ошибок: коды состояния HTTP
  4. SWR и React Query для кэширования данных
← Назад к Frontend Academy