FAQ по редьюсерам¶
Как мне передавать состояние(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
.
Документация
Обсуждения