2️⃣GET. Query запрос
⚡ 1) Сделаем первый запрос согласно документации
В папке cards создайте папку services, а в ней файл cards.api.ts
//❗1) Обязательно импорт должен быть таким, иначе будут ошибки
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
// ✅ 2) createApi - это функция, предоставляемая RTK Query,
// которая позволяет создать объект API для взаимодействия с внешними API и управления состоянием приложения
export const cardsApi = createApi({
// ✅ 3)reducerPath - имя среза (slice) Redux, куда будут сохранены состояние и экшены для этого API.
reducerPath: "cardsApi",
// ✅ 4) baseQuery - конфигурация для HTTP клиента, который будет использоваться для отправки запросов.
baseQuery: fetchBaseQuery({
baseUrl: "http://localhost:7542/2.0/",
}),
// ✅ 5) endpoints - объект, содержащий эндпоинты для этого API, описанные с помощью функций, которые будут вызываться при вызове соответствующих методов API (например, get, post, put, patch, delete). Обязательный параметр.
endpoints: (build) => {
return {
// 1 параметр - тип того, что возвращает сервер (ResultType)
// 2 параметр - тип query аргументов (QueryArg)
getCards: build.query<any, string>({
query: (packId) => {
return {
method: "GET",
url: "cards/card",
params: {
cardsPack_id: packId,
},
};
},
}),
};
},
});
// ✅ 6) createApi возвращает объект API, который содержит все эндпоинты, определенные в параметре endpoints, а также набор вспомогательных функций, таких как useLazyQuery и usePrefetch.
export const { useGetCardsQuery } = cardsApi;
для того чтобы не дублировать baseUrl, давайте в
common.api.tsвынесем baseURL отдельную переменную, экспортируем ее и импортируем вместо хардкода "http://localhost:7542/2.0/"
⚡2) Подключим cardsApi к store
⚡3) Воспользуемся cardsApi в компоненте
Давайте теперь наконец сделаем запрос. Но опять ошибка 👿

Ошибка говорит нам о том, что мы не авторизованы. Но почему тогда колоды подгружаются... Чтобы понять эту проблемы нужно вспомнить что такое withCredentials
Вот так можно решить эту проблему
И теперь запрос наконец то должен пройти 🚀
⚡4) Посмотрим подробнее на хук который создал RTK query (useGetCardsQuery)
⚡4.1 ) Для начала давайте протипизируем ответ с сервера.
❗Чтобы не городить типы в одном месте давайте типы будем складывать в отдельный файл cards.api.types.ts
❗CardType протипизируем после того как создадим первую карточку
⚡4.2 ) Loading
Поставим debugger и посмотрим как меняется isLoading
Теперь мы понимаем что нам не обязательно хранить отдельную переменную isLoading для каждого редьюсера или глобально. Крутилку покажем следующим образом
Крутилка должна появиться 🚀 ❓Но у нас в некоторый момент будет 2 крутилки. Кто скажет почему и как решить эту проблему?
Давайте зайдем в redux devtools и посмотрим, что у нас появилось

По итогу у нас есть 2 варианта решения: 1) Оставить глобальную крутилку и при этом ничего не менять 2) Делать какие то исключения в addMatcher pending.
Чтобы не усложнять код, остановимся на первом варианте
⚡ 4.3.) Обработка ошибок - это тяжелая и мутная тема, поэтому рассмотрим ее в конце
⚡4.4) Query hook возвращает нам объект с двумя параметрами:
queryArg - объект, содержащий свойства, такие как последние данные для запроса, а также логические значения статуса для текущего состояния жизненного цикла запроса
queryOptions. Объект queryOptions принимает несколько дополнительных параметров, которые можно использовать для управления процессом получения данных.
Last updated