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 — локальная установка не требуется.
Все уроки этого курса
- Fetch API: GET, POST, PUT и DELETE
- Axios: перехватчики и базовый URL
- Обработка ошибок: коды состояния HTTP
- SWR и React Query для кэширования данных