Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →
Быстрый старт с Redux Toolkit
- Как настроить и использовать Redux Toolkit с React-Redux
- Знакомство с синтаксисом и возможностями ES6
- Понимание терминологии React: JSX, Состояние, Функциональные компоненты, Пропсы и Хуки
- Знание терминов и концепций Redux
Введение
Добро пожаловать в руководство по быстрому старту с Redux Toolkit! Этот туториал кратко познакомит вас с Redux Toolkit и научит правильно его использовать.
Как работать с этим учебником
На этой странице мы сосредоточимся только на настройке Redux-приложения с помощью Redux Toolkit и основных API. Объяснения, что такое Redux, как он работает, и полные примеры использования Redux Toolkit вы найдёте в руководствах, перечисленных на странице "Индекс учебных материалов".
В этом руководстве мы предполагаем использование Redux Toolkit с React, но вы можете применять его и с другими UI-библиотеками. Примеры основаны на типичной структуре папок Create-React-App, где весь код приложения находится в папке src, но шаблоны можно адаптировать под любую структуру проекта.
Шаблон Redux+JS для Create-React-App уже содержит предварительно настроенную структуру проекта.
Краткое руководство
Установка Redux Toolkit и React-Redux
Добавьте пакеты Redux Toolkit и React-Redux в ваш проект:
npm install @reduxjs/toolkit react-redux
Создание Redux-хранилища
Создайте файл src/app/store.js. Импортируйте API configureStore из Redux Toolkit. Начнём с создания пустого Redux-хранилища и его экспорта:
import { configureStore } from '@reduxjs/toolkit'
export default configureStore({
reducer: {}
})
Это создаёт хранилище Redux и автоматически настраивает расширение Redux DevTools, позволяя проверять хранилище во время разработки.
Подключение Redux-хранилища к React
После создания хранилища мы можем сделать его доступным для React-компонентов, обернув наше приложение в <Provider> из React-Redux в файле src/index.js. Импортируйте созданное хранилище, оберните ваше приложение <App> в <Provider> и передайте хранилище как пропс:
import React from 'react'
import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App'
import store from './app/store'
import { Provider } from 'react-redux'
const root = createRoot(document.getElementById('root')!)
root.render(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>,
)
Создание среза состояния Redux
Добавьте новый файл src/features/counter/counterSlice.js. В этом файле импортируйте API createSlice из Redux Toolkit.
Для создания среза требуется строковое имя для идентификации, начальное состояние и одна или несколько функций-редюсеров, определяющих обновление состояния. После создания среза мы можем экспортировать сгенерированные экшен-креаторы и функцию-редюсер для всего среза.
Redux требует, чтобы все обновления состояния выполнялись иммутабельно, через создание копий данных и их обновление. Однако API createSlice и createReducer из Redux Toolkit используют Immer внутри, позволяя писать "мутабельную" логику обновления, которая преобразуется в корректные иммутабельные обновления.
import { createSlice } from '@reduxjs/toolkit'
export const counterSlice = createSlice({
name: 'counter',
initialState: {
value: 0
},
reducers: {
increment: state => {
// Redux Toolkit allows us to write "mutating" logic in reducers. It
// doesn't actually mutate the state because it uses the Immer library,
// which detects changes to a "draft state" and produces a brand new
// immutable state based off those changes
state.value += 1
},
decrement: state => {
state.value -= 1
},
incrementByAmount: (state, action) => {
state.value += action.payload
}
}
})
// Action creators are generated for each case reducer function
export const { increment, decrement, incrementByAmount } = counterSlice.actions
export default counterSlice.reducer
Добавление редюсеров среза в хранилище
Далее нам нужно импортировать функцию редюсера из слайса счётчика и добавить его в наше хранилище. Определив поле в параметре reducer, мы указываем хранилищу использовать этот слайс-редюсер для обработки всех обновлений данного состояния.
import { configureStore } from '@reduxjs/toolkit'
import counterReducer from '../features/counter/counterSlice'
export default configureStore({
reducer: {
counter: counterReducer
}
})
Использование состояния Redux и действий в React-компонентах
Теперь мы можем использовать хуки React-Redux для взаимодействия React-компонентов с хранилищем Redux. Чтение данных из хранилища осуществляется через useSelector, а диспетчеризация действий — через useDispatch. Создайте файл src/features/counter/Counter.js с компонентом <Counter>, затем импортируйте его в App.js и отобразите внутри <App>.
import React from 'react'
import { useSelector, useDispatch } from 'react-redux'
import { decrement, increment } from './counterSlice'
import styles from './Counter.module.css'
export function Counter() {
const count = useSelector(state => state.counter.value)
const dispatch = useDispatch()
return (
<div>
<div>
<button
aria-label="Increment value"
onClick={() => dispatch(increment())}
>
Increment
</button>
<span>{count}</span>
<button
aria-label="Decrement value"
onClick={() => dispatch(decrement())}
>
Decrement
</button>
</div>
</div>
)
}
Теперь при каждом нажатии кнопок "Increment" (Увеличить) и "Decrement" (Уменьшить):
-
Соответствующее действие Redux будет отправлено в хранилище
-
Редюсер слайса счётчика обработает действие и обновит своё состояние
-
Компонент
<Counter>получит новое значение состояния из хранилища и перерендерится с обновлёнными данными
Итоги изученного
Это был краткий обзор настройки и использования Redux Toolkit с React. Подведём итоги:
- Создание хранилища Redux через
configureStoreconfigureStoreпринимает функциюreducerкак именованный аргументconfigureStoreавтоматически настраивает хранилище с оптимальными параметрами
- Предоставление хранилища React-компонентам
- Оберните приложение
<App />в компонент<Provider>из React-Redux - Передайте хранилище как
<Provider store={store}>
- Оберните приложение
- Создание слайс-редюсера через
createSlice- Вызовите
createSliceс именем (строкой), начальным состоянием и именованными функциями-редюсерами - Редюсеры могут "мутировать" состояние благодаря Immer
- Экспортируйте сгенерированный слайс-редюсер и создатели действий
- Вызовите
- Использование хуков
useSelector/useDispatchв React-компонентах- Чтение данных из хранилища через хук
useSelector - Получение функции
dispatchчерез хукuseDispatchи отправка действий при необходимости
- Чтение данных из хранилища через хук
Полный пример приложения-счётчика
Полная работающая версия приложения-счётчика на CodeSandbox:
Что дальше?
Рекомендуем пройти полный учебник «Redux Essentials», который охватывает все ключевые компоненты Redux Toolkit, решаемые ими проблемы и их применение в реальных приложениях.
Также полезно ознакомиться с учебником «Redux Fundamentals», который даст полное понимание работы Redux, функционала Redux Toolkit и правил его использования.