Редьюсеры
Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →
Redux FAQ: Редьюсеры
Как обмениваться состоянием между двумя редьюсерами? Обязательно ли использовать combineReducers?
Рекомендуемая структура хранилища Redux — разделение объекта состояния на несколько «срезов» (slices) или «доменов» (domains) по ключам, где каждый срез данных управляется отдельной функцией-редьюсером. Это аналогично подходу Flux с независимыми хранилищами. Redux предоставляет функцию combineReducers для упрощения этой модели. Однако combineReducers не обязателен — это просто утилита для типичного сценария, где каждый срез состояния обрабатывается одним редьюсером с использованием обычных JavaScript-объектов.
Многие разработчики пытаются обмениваться данными между редьюсерами, но обнаруживают, что combineReducers это запрещает. Доступны следующие подходы:
-
Если редьюсеру нужны данные из другого среза состояния, реорганизуйте структуру дерева так, чтобы один редьюсер обрабатывал больше данных.
-
Реализуйте кастомные функции обработки действий. Это может потребовать замены
combineReducersна собственный корневой редьюсер. Также можно использовать утилиты вроде reduce-reducers:combineReducersобрабатывает большинство действий, а специализированный редьюсер — кросс-срезовые действия. -
Middleware с асинхронной логикой (например, redux-thunk) получают полное состояние через
getState(). Action creator может извлекать дополнительные данные из состояния и помещать их в действие, предоставляя каждому редьюсеру достаточно информации для обновления своего среза.
Помните: редьюсеры — просто функции. Организуйте их как угодно, дробите на мелкие переиспользуемые функции («композиция редьюсеров»). При необходимости передавайте кастомный третий аргумент из родительского редьюсера, если дочернему нужны дополнительные данные. Главное — соблюдать базовые правила: (state, action) => newState и иммутабельное обновление состояния.
Дополнительные материалы
Документация
Обсуждения
-
#601: Проблема combineReducers при действиях, затрагивающих несколько редьюсеров
-
#1400: Является ли передача состояния верхнего уровня редьюсеру ветки антипаттерном?
-
Stack Overflow: Доступ к другим частям состояния при использовании combineReducers
-
Stack Overflow: Управление поддеревом состояния через redux combineReducers
Обязательно ли использовать оператор switch для обработки действий?
Нет. Для обработки действий в редьюсере подходит любой подход. switch — наиболее распространённый вариант, но можно использовать if, таблицы функций или абстрагирующие функции. Хотя Redux требует поле type в действиях, логика редьюсера может вообще не опираться на него. Тем не менее, стандартом остаётся switch или таблицы функций на основе type.
Дополнительные материалы
Документация
Обсуждения