Redux Toolkit — это официальная библиотека для упрощения работы с Redux. Она включает мощные инструменты для создания стейта и обработки асинхронных действий, такие как createSlice
и createAsyncThunk
.
1. Установка Redux Toolkit
Для начала установите Redux Toolkit и React-Redux:
npm install @reduxjs/toolkit react-redux
2. createSlice
Что такое `createSlice`?
`createSlice` упрощает создание редьюсеров и экшенов. Он позволяет: - Определять начальное состояние. - Автоматически генерировать экшены. - Объединять редьюсеры в одном месте.Синтаксис
```javascript import { createSlice } from '@reduxjs/toolkit';const slice = createSlice({ name: 'sliceName', initialState: {}, reducers: { actionName: (state, action) => { // Логика изменения состояния } } });
export const { actionName } = slice.actions; export default slice.reducer;
<h3 id="пример">Пример</h3>
```javascript
import { createSlice } from '@reduxjs/toolkit';
const counterSlice = createSlice({
name: 'counter',
initialState: { value: 0 },
reducers: {
increment: (state) => {
state.value += 1;
},
decrement: (state) => {
state.value -= 1;
},
incrementByAmount: (state, action) => {
state.value += action.payload;
}
}
});
export const { increment, decrement, incrementByAmount } = counterSlice.actions;
export default counterSlice.reducer;
3. createAsyncThunk
Что такое `createAsyncThunk`?
`createAsyncThunk` используется для обработки асинхронных операций, таких как запросы к API. Он автоматически создаёт экшены `pending`, `fulfilled` и `rejected`.Синтаксис
```javascript import { createAsyncThunk } from '@reduxjs/toolkit';export const asyncAction = createAsyncThunk( 'sliceName/asyncAction', async (payload, thunkAPI) => { // Логика асинхронной операции } );
<h3 id="пример">Пример</h3>
```javascript
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
export const fetchUser = createAsyncThunk('user/fetchUser', async (userId) => {
const response = await fetch(`/api/user/${userId}`);
return response.json();
});
const userSlice = createSlice({
name: 'user',
initialState: { data: null, status: 'idle', error: null },
reducers: {},
extraReducers: (builder) => {
builder
.addCase(fetchUser.pending, (state) => {
state.status = 'loading';
})
.addCase(fetchUser.fulfilled, (state, action) => {
state.status = 'succeeded';
state.data = action.payload;
})
.addCase(fetchUser.rejected, (state, action) => {
state.status = 'failed';
state.error = action.error.message;
});
}
});
export default userSlice.reducer;
4. Интеграция с React
Настройка Store
```javascript import { configureStore } from '@reduxjs/toolkit'; import counterReducer from './counterSlice'; import userReducer from './userSlice';const store = configureStore({ reducer: { counter: counterReducer, user: userReducer } });
export default store;
<h3 id="оборачивание-provider">Оборачивание Provider</h3>
```javascript
import React from 'react';
import { Provider } from 'react-redux';
import store from './store';
import App from './App';
const Root = () => (
<Provider store={store}>
<App />
</Provider>
);
export default Root;
Использование хуков
useSelector
```javascript import { useSelector } from 'react-redux';function Counter() { const count = useSelector((state) => state.counter.value); return
Count: {count}
; }
<h4 id="usedispatch">useDispatch</h4>
```javascript
import { useDispatch } from 'react-redux';
import { increment, decrement } from './counterSlice';
function CounterButtons() {
const dispatch = useDispatch();
return (
<div>
<button onClick={() => dispatch(increment())}>+</button>
<button onClick={() => dispatch(decrement())}>-</button>
</div>
);
}
Итоговые вопросы для подготовки
- Как
createSlice
упрощает создание редьюсеров и экшенов? - Чем полезен
createAsyncThunk
, и как он обрабатывает состоянияpending
,fulfilled
иrejected
? - Как настроить стор с использованием Redux Toolkit?
- Как обрабатывать асинхронные операции в Redux Toolkit?
- Какие преимущества предоставляет Redux Toolkit перед классическим Redux?
Совет: Реализуйте проект с использованием createSlice
и createAsyncThunk
, чтобы освоить возможности Redux Toolkit.