TanStack Query - это библиотека для управления стейтом и кэширования данных в приложении React. Она предоставляет набор хуков, которые помогают работать с асинхронными запросами и кэшированием данных.
Вот перечень основных хуков TanStack Query:
useQuery: позволяет получить данные из асинхронного источника (например, API) и автоматически кэширует их. Этот хук также обрабатывает ошибки и отменяет запросы при размонтировании компонента.
useMutation: позволяет отправлять асинхронные запросы для создания/обновления/удаления данных на сервере. Возвращает объект с методом mutate, который можно вызвать для выполнения запроса.
usePaginatedQuery: позволяет загружать данные постранично. Возвращает объект со страницами данных и методами для переключения между страницами.
useInfiniteQuery: позволяет загружать данные пачками (например, при бесконечной подгрузке новых записей). Похож на usePaginatedQuery, но загружает данные динамически по мере прокрутки.
useQueryClient: позволяет получить экземпляр клиента TanStack Query, который содержит информацию о кэшах, запросах и других внутренних состояниях.
useIsFetching: позволяет отслеживать количество активных запросов на странице.
Setup
Для начала нам нужно установить сам модуль и его девтулзы, которые позволят детально отследить его работу
Далее нам нужно обернуть в данный модуль всё приложение, чтобы оно отслеживало запросы
Так же добавим ReactQueryDevtools, который предоставит возможность отслеживать данные внутри приложения
index.ts
Basic Example
Далее создадим приложение, которое будет выводить посты. Посты мы храним прямо в компоненте. Так же мы создали функцию wait(), которая через определённое ожидание будет возвращать промис и выполнять определённое действие.
Первым делом мы запросим данные по постам через useQuery, который принимает queryKey (ключ для создания уникального запроса), queryFn (функцию запроса данных с сервера)
Далее для изменения данных используется useMutation, который принимает mutationFn (функция отправки запроса и мутации данных на сервере) и свойство, которое будет выполнять логику при успешном запросе onSuccess. В последнее свойство мы поместим метод клиента запросов invalidateQueries(), который обновит пришедшие посты
App.tsx
Глобальные настройки
Глобальные настройки задаются внутри QueryClient, который мы задаём в корневом компоненте. Мы можем задавать опции для queries и mutations.
_app.tsx
useQuery
Первым делом стоит сказать, что функция запроса по умолчанию в себя принимает объект, который содержит некоторые метаданные и ключи, которые могут пригодиться в запросе
Мы можем проверить статус так же здесь
Так же все запросы, на которые мы получили ответ, будут кешироваться в памяти и при перезагрузке страницы сначала отобразятся закешированные данные, а уже потом, в фоне, будут подгружаться новые данные, которые затем отобразятся
Чтобы данные оставались актуальными нужное нам количество времени (например, перезагружать список постов только раз в 5 минут, а не каждый раз при переходе на страницу), то можно указать, как для всего приложения время устаревания данных:
index.tsx
Так и указать время устаревания для отдельного хука запроса с помощью staleTime:
App.tsx
Так же с помощью refetchInterval мы можем явно указать раз в какое время нужно заново загружать данные:
App.tsx
Свойство enabled останавливает (если false) или выполняет (если true) запрос на получение данных. Может помочь, если требуется отображать данные, если подгрузились другие данные или просто совершать подгрузку по условию
Тут показаны самые частые данные, которые берутся из запроса
Настройки проекта, типизация с Typescript
Изначально стоит забиндить сервис, который будет работать с запросами в приложении
app > services > country.service.ts
События onSuccess, onError
Так же события onSuccess и onError очень удобно использовать внутри query для реагирования на получение или на ошибку, так как эту логику взаимодействия мы описываем прямо внутри TanStack запросов
Трансформация данных (select)
select позволяет изменить уже существующие данные и обработать их нужным для нас образом
Кастомный хук
Так же хорошей практикой является реализация хуков для получение определённых данных через react-query
app > hooks > useCountries.ts
Использование:
pages > index.tsx
Передать аргумент в useQuery (подгрузка по ID)
Уже таким образом будет выглядеть хук с передачей в него id
app > hooks > useCountry.ts
И так выглядит использование хука с передачей аргумента
pages > country > [id].tsx
GET запрос по кнопке “refetch”
Если мы хотим реализовать переполучение данных, чтобы пользователь сам запрашивал их по своему усмотрению, то из query можно вытащить метод refetch, который можно передать в качестве onClick в кнопку
Devtools
Девтулзы позволяют нам запросить данные заново, сделать их неактуальными, сбросить или удалить - справа в блоке с самими данными. Так же они показывают свежие данные, запросы в данный момент времени, старые данные и неактивные запросы - слева вверху в блоке со всеми запросами
useMutation
Для совершения мутации используется хук useMutation, который отправляет запросы на изменение данных на сервере