Перейти к содержимому

2. Query: основы

TanStack Query — библиотека для управления серверным состоянием в React-приложениях. В отличие от Redux или Zustand (которые управляют клиентским состоянием), TanStack Query решает задачи, специфичные для работы с сервером: кэширование, фоновое обновление, синхронизация, дедупликация запросов.

Клиентское состояние — данные, которые живут только в браузере:

  • Открыт/закрыт модал
  • Выбранная вкладка
  • Значения формы (до отправки)

Серверное состояние — данные, хранящиеся на сервере:

  • Список пользователей из базы данных
  • Профиль текущего пользователя
  • Настройки из API

Серверное состояние имеет уникальные проблемы: оно может устареть, другие пользователи могут его изменить, его нужно синхронизировать. TanStack Query решает всё это автоматически.

QueryClient — это центральный объект, который управляет кэшем и конфигурацией. Создаётся один раз на приложение:

import { QueryClient } from '@tanstack/react-query'
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 1000 * 60 * 5, // 5 минут до устаревания
gcTime: 1000 * 60 * 10, // 10 минут до удаления из кэша
retry: 3, // 3 попытки при ошибке
refetchOnWindowFocus: true, // Обновление при фокусе окна
},
},
})

Чтобы хуки TanStack Query работали, нужно обернуть приложение в QueryClientProvider:

import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
const queryClient = new QueryClient()
function App() {
return (
<QueryClientProvider client={queryClient}>
<MyApp />
<ReactQueryDevtools initialIsOpen={false} />
</QueryClientProvider>
)
}

@tanstack/react-query-devtools — незаменимый инструмент для отладки. Показывает:

  • Все активные и неактивные запросы
  • Статус каждого запроса (loading, error, success, stale)
  • Данные в кэше
  • Конфигурацию запроса

Устанавливается отдельно: npm install @tanstack/react-query-devtools

КонцепцияОписание
queryKeyУникальный ключ для идентификации запроса в кэше
queryFnФункция, которая получает данные (должна возвращать Promise)
staleTimeВремя, в течение которого данные считаются свежими
gcTimeВремя хранения неиспользуемых данных в кэше
enabledФлаг активации запроса
Окно терминала
npm install @tanstack/react-query
npm install @tanstack/react-query-devtools # для разработки