1. Основы Redux Toolkit: Настройка Store, создание Slices и Reducers
Основы Redux Toolkit: Настройка Store, создание Slices и Reducers
Redux Toolkit (RTK) — это современный стандарт разработки приложений с использованием Redux. Он решает основные проблемы классического Redux: сложность настройки хранилища, необходимость установки множества дополнительных пакетов и большое количество шаблонного кода (boilerplate). RTK предоставляет набор инструментов, которые упрощают написание эффективного и понятного кода.
Установка зависимостей
Для начала работы необходимо установить два ключевых пакета: сам инструментарий и связующую библиотеку для React.
Создание хранилища (Store)
В классическом Redux настройка хранилища требовала ручной конфигурации middleware, DevTools и объединения редьюсеров. В RTK для этого используется функция configureStore.
Эта функция автоматически:
redux-thunk для асинхронности).Создадим файл store.js:
Объект reducer внутри configureStore определяет структуру глобального состояния. В данном примере состояние будет иметь поле counter, управляемое соответствующим редьюсером.
Концепция Слайсов (Slices)
Слайс (Slice) — это ключевая концепция Redux Toolkit. Это модуль, который объединяет в себе логику обработки состояния (редьюсеры) и действия (actions), связанные с конкретной функциональностью приложения (например, счетчик, пользователь, список задач).
Раньше разработчикам приходилось создавать отдельные файлы для типов действий (constants), генераторов действий (action creators) и редьюсеров. Функция createSlice генерирует всё это автоматически.
Создание слайса
Рассмотрим пример создания слайса для счетчика в файле features/counter/counterSlice.js:
Магия Immer и мутабельность
Одним из самых сложных правил Redux всегда был запрет на прямую мутацию состояния. Вы были обязаны возвращать новый объект, используя операторы spread (...state).
Redux Toolkit использует библиотеку Immer под капотом. Это позволяет писать код так, будто вы меняете состояние напрямую (state.value += 1), но в результате Immer безопасно создает новую копию состояния (immutable update). Это значительно сокращает код и делает его более читаемым.
Важно помнить: такой синтаксис допустим только внутри createSlice (или createReducer).
Подключение Store к React
Чтобы React-компоненты могли взаимодействовать с Redux, необходимо обернуть корневой компонент приложения в Provider. Это делается обычно в файле index.js или main.jsx.
Компонент Provider принимает проп store и делает его доступным для любого вложенного компонента через хуки.
Использование состояния и действий в компонентах
Для взаимодействия с Redux в функциональных компонентах используются два основных хука из библиотеки react-redux:
useSelector — для чтения данных из хранилища.useDispatch — для отправки действий (actions) для изменения состояния.Чтение данных с useSelector
Хук useSelector принимает функцию-селектор, которая получает всё состояние (state) и возвращает нужную его часть.
Когда значение state.counter.value изменится, компонент автоматически перерисуется.
Отправка действий с useDispatch
Хук useDispatch возвращает функцию dispatch, которую нужно вызывать с объектом действия (action). Действия мы импортируем из созданного ранее слайса.
Когда пользователь нажимает кнопку, dispatch(increment()) отправляет действие в Store. Store находит соответствующий редьюсер в слайсе, выполняет логику обновления, и новое состояние распространяется по приложению.
Передача данных через Payload
Часто действию нужно передать дополнительные данные (например, на сколько увеличить счетчик или текст новой задачи). В createSlice эти данные доступны через action.payload.
В компоненте это выглядит так:
Здесь amount попадет в action.payload внутри редьюсера incrementByAmount.
Итоги
createSlice, что делает редьюсеры более понятными.