Files
flashcards-docs/pages/lesson-3/chapter-2.ru.mdx
2023-08-05 16:59:11 +02:00

108 lines
2.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# RTK Query
## Установка
```bash filename="Terminal"
pnpm i @reduxjs/toolkit react-redux
```
## Создание стора
```ts filename="src/services/store.ts"
import { configureStore } from '@reduxjs/toolkit'
export const store = configureStore({
reducer: {},
middleware: getDefaultMiddleware => getDefaultMiddleware(),
})
export type AppDispatch = typeof store.dispatch
export type RootState = ReturnType<typeof store.getState>
```
## Подключение стора к приложению
```tsx filename="src/App.tsx"
import { Provider } from 'react-redux'
import { Router } from '@/router'
import { store } from '@/services/store'
export function App() {
return (
<Provider store={store}>
<Router />
</Provider>
)
}
```
## Создание Api
### Создание базового Api
```ts filename="src/services/base-api.ts"
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'
export const baseApi = createApi({
reducerPath: 'baseApi',
baseQuery: fetchBaseQuery({
baseUrl: 'https://api.flashcards.andrii.es',
credentials: 'include',
prepareHeaders: headers => {
headers.append('x-auth-skip', 'true')
},
}),
endpoints: builder => {
return {
getDecks: builder.query<any, void>({
query: () => `v1/decks`,
}),
}
},
})
export const { useGetDecksQuery } = baseApi
```
### Подключение базового Api к стору
```ts filename="src/services/store.ts"
import { configureStore } from '@reduxjs/toolkit'
import { baseApi } from './base-api'
export const store = configureStore({
reducer: {
[baseApi.reducerPath]: baseApi.reducer,
},
middleware: getDefaultMiddleware => getDefaultMiddleware().concat(baseApi.middleware),
})
```
### Использование хука
Что бы протестировать как работает хук, вызовем его в Router компоненте:
```tsx filename="src/router.tsx"
export const Router = () => {
const result = useGetDecksQuery()
console.log(result)
return <RouterProvider router={router} />
}
```
В консоли получим следующее:
![result-console](./images/result-console.png)
На каждое изменение статуса промиса мы получаем обновленный объект с данными о запросе.
Обычно нам из этого интересны следующие поля:
- `data` - данные, которые вернул запрос
- `isLoading` - флаг, который показывает, что запрос выполняется
- `isError` - флаг, который показывает, что запрос завершился с ошибкой
- `error` - объект ошибки