Redux FAQ: Редюсеры
Содержание
- Как мне передавать состояние(state) между двумя редюсерами? Должен ли я использовать combineReducers?
- Должен ли я использовать оператор switch для обработки экшенов (actions)?
Редюсеры
Как мне передавать состояние(state) между двумя редюсерами? Должен ли я использовать combineReducers
?
Рекомендуемая структура Redux-стора — это разделение объекта состояния на несколько “частей” или “областей” по ключу, и предоставление отдельной функции-редюсера для управления каждой частью данных. Это похоже на то, как стандартная Flux структура имеет несколько независимых сторов, а Redux предоставляет утилиту комбинация редюсеров (combineReducers)
для упрощения реализации этого подхода. Однако, важно заметить, что комбинация редюсеров
необязательна — это просто функция для совместного использования имеющихся редюсеров (по одному на каждую часть состояния) с простыми JavaScript-объектами для данных.
У многих пользователей возникает необходимость реализовать обмен данными между двумя редюсерами, но комбинация редюсеров
не позволяет им сделать это. Существует несколько подходов для решения этой задачи:
- Если редюсеру нужны данные из другой части состояния, то дерево состояния требуется переорганизовать так, чтобы один редюсер охватывал больше данных.
- Вам может понадобиться написать некоторые стандартные функции для обработки некоторых из этих экшенов. Это требует обязательной замены
комбинации редюсеров
на Вашу собственную функцию-редюсер верхнего порядка. Вы также можете использовать такие утилиты, как reduce-reducers, для запускакомбинации редюсеров
для обработки большинства экшенов, но также можно запустить более специализированный редюсер для конкретных экшенов, который скрещивает части состояния. - Асинхронные генераторы экшенов, такие как redux-thunk, имеют доступ ко всему состоянию через
getState()
. Генератор экшенов может извлечь дополнительные данные из состояния и передать их в экшен, таким образом, каждый редюсер имеет достаточно информации для обновления своей части состояния.
В общем, помните, что редюсеры — это всего лишь функции. Вы можете организовать их и разделить по своему усмотрению, и вам следует разбить их на более мелкие переиспользуемые функции (“композиция редюсеров”). Пока Вы это делаете, Вы можете передавать в нестандартном третьем аргументе необходимые для вычисления следующего состояния дополнительные данные от родительского редюсера к дочернему. Только Вам надо убедиться, что соблюдается главное правило редюсеров: (state, action) => newState
, и состояние не изменяется напрямую.
Дополнительная информация
Документация
Обсуждения
- #601: A concern on combineReducers, when an action is related to multiple reducers
- #1400: Is passing top-level state object to branch reducer an anti-pattern?
- Stack Overflow: Accessing other parts of the state when using combined reducers?
- Stack Overflow: Reducing an entire subtree with redux combineReducers
- Sharing State Between Redux Reducers
Должен ли я использовать оператор switch
для обработки экшенов (actions)
Нет, вы можете использовать любой подход, с помощью которого вы бы хотели реагировать на экшенов в редюсере. Оператор switch
является наиболее распространенным подходом, но так же отлично подойдет и оператор if
, таблица соответствия функций или создание функции, которая абстрагирует все это. На самом деле, пока Redux требует, чтобы объект экшенов содержал поле type
, логике вашего редюсера даже не придется полагаться на то, чтобы управлять экшеном.
Тем не менее, стандартный подход, безусловно, с помощью инструкции switch
или таблицы поиска, основанной на type
.
Дополнительная информация
Документация
Обсуждения