Redux Toolkit
Redux Toolkit - это набор утилит, облегчающих работу с Redux - инструментом для управления состоянием приложений.
Он был разработан для решения трех главных проблем:
- Слишком сложная настройка хранилища (store)
- Для того, чтобы заставить
Redux
делать что-то полезное, приходится использовать дополнительные пакеты - Слишком много шаблонного кода (boilerplate)
Redux Toolkit
предоставляет инструменты для настройки хранилища и выполнения наиболее распространенных операций, а также содержит полезные утилиты, позволяющие упростить код.
Установка
Создание нового приложения с помощью Create React App
# app-name - это название приложения
yarn create react-app app-name --template redux
# или
npx create-react-app app-name --template redux
TypeScript
yarn create react-app app-name --template redux-typescript
# или
npx create-react-app app-name --template redux-typescript
Добавление пакета в существующее приложение
yarn add @reduxjs/toolkit
# или
npm i @reduxjs/toolkit
Состав пакета
Redux Toolkit
включает в себя следующие API:
configureStore()
: обертка дляcreateStore()
, упрощающая настройку хранилища с настройками по умолчанию. Позволяет автоматически комбинировать отдельные частичные редукторы (slice reducers), добавлять промежуточные слои или посредников (middlewares), по умолчанию включаетredux-thunk
(преобразователя), позволяет использовать расширениеRedux DevTools
(инструменты разработчикаRedux
)createReducer()
: позволяет использовать таблицу поиска (lookup table) операций для редукторов случая (case reducers) вместо инструкцийswitch
. В данном API используется библиотекаimmer
, позволяющая напрямую изменять иммутабельный код, например, так:state.todos[3].completed = true
createAction()
: генерирует создателя операции (action creator) для переданного типа операции. Функция имеет переопределенный методtoString()
, что позволяет использовать ее вместо константы типаcreateSlice()
: принимает объект, содержащий редуктор, название части состояния (state slice), начальное значение состояния, и автоматически генерирует частичный редуктор с соответствующими создателями и типами операцииcreateAsyncThunk()
: принимает тип операции и функцию, возвращающую промис, и генерируетthunk
, отправляющий типы операцииpending/fulfilled/rejected
на основе промисаcreateEntityAdapter()
: генерирует набор переиспользуемых редукторов и селекторов для управления нормализованными данными в хранилище- утилита
createSelector()
из библиотекиReselect
Руководство по использованию
Настройка хранилища (store setup)
Разработка любого Redux
-приложения предполагает создание и настройку хранилища. Как правило, данный процесс состоит из следующих этапов:
- Импорт или создание корневого редуктора (root reducer)
- Настройка
middleware
, как минимум, для работы с асинхронным кодом - Настройка инструментов разработчика
Redux
- Возможно, программное изменение кода в зависимости от режима разработки
Ручная настройка
Приведенный ниже пример демострирует типичный процесс настройки хранилища:
import { applyMiddleware, createStore } from 'redux'
import { composeWithDevTools } from 'redux-devtools-extension'
import thunkMiddleware from 'redux-thunk'
import monitorReducersEnhancer from './enhancers/monitorReducers'
import loggerMiddleware from './middleware/logger'
import rootReducer from './reducers'
export default function configureStore(preloadedState) {
const middlewares = [thunkMiddleware, loggerMiddleware]
const middlewareEnhacer = applyMiddleware(...middlewares)
const enhancers = [monitorReducersEnhancer, middlewareEnhacer]
const composedEnhancers = composeWithDevTools(...enhancers)
const store = createStore(rootReducer, preloadedState, composedEnhancers)
if (process.env.NODE_ENV !== 'production' && module.hot) {
module.hot.accept('./reducers', () => store.replaceReducer(rootReducer))
}
return store
}
Проблемы данного подхода:
- Аргументы
(rootReducer, preloadedState, enhancer)
должны быть переданы функцииcreateStore()
в правильном порядке - Процесс настройки
middlewares
иenhancers
(усилителей) может быть сложным, особенно, при попытке добавить несколько частей конфигурации - Документация
Redux DevTools Extension
рекомендует использовать некоторый код для проверки глобального пространства имен для опеределения доступности расширения. Копирование/вставка предложенного сниппета усложняет последующее изучение кода