Redux FAQ: Reducers
Оглавление
- Как мне поделиться состоянием между двумя редьюсерами? Нужно ли использовать combineReducers?
- Должен ли я использовать оператор switch для обработки действий?
Редьюсеры
Как мне поделиться состоянием между двумя редьюсерами? Нужно ли использовать combineReducers?
Рекомендуемая структура для Redux хранилища заключается в разделении объекта состояния на несколько «фрагментов» или «областей» по ключам и предоставлении отдельной функции-редусера для управления каждым отдельным фрагментом данных. Это аналогично тому, как стандартный паттерн Flux имеет несколько независимых хранилищ, и Redux предоставляет утилиту combineReducers, чтобы упростить этот паттерн. Однако важно отметить, что combineReducers не требуется — это просто утилита для распространённого случая наличия одной функции-редусера на фрагмент состояния, с обычными JavaScript-объектами для данных.
Многие пользователи позже хотят попробовать поделиться данными между двумя редьюсерами, но обнаруживают, что combineReducers не позволяет им это сделать. Существует несколько подходов, которые можно использовать:
- Если редьюсеру нужны данные из другого фрагмента состояния, структура дерева состояния может потребовать перестройки, чтобы один редьюсер обрабатывал больше данных.
- Возможно, вам нужно написать некоторые пользовательские функции для обработки некоторых из этих действий. Это может потребовать замены
combineReducersвашей собственной функцией редусера верхнего уровня. Вы также можете использовать утилиту, такую как reduce-reducers, чтобы запуститьcombineReducersдля обработки большинства действий, но также запустить более специализированный редьюсер для конкретных действий, которые пересекают фрагменты состояния. -
Асинхронные создатели действий, такие как redux-thunk, имеют доступ ко всему состоянию через
getState(). Создатель действия может извлечь дополнительные данные из состояния и поместить их в действие, чтобы каждый редьюсер имел достаточно информации для обновления своего собственного фрагмента состояния.
В общем, помните, что редьюсеры — это просто функции; вы можете организовать и разбить их любым желаемым способом, и вам рекомендуется разбить их на более мелкие, переиспользуемые функции («композиция редьюсеров»). Когда вы это делаете, вы можете передать дополнительный аргумент из родительского редьюсера, если дочерний редьюсер нуждается в дополнительных данных для вычисления следующего состояния. Вам просто нужно убедиться, что вместе они следуют основным правилам редьюсеров: (state, action) => newState, и изменяют состояние неизменяемо, а не изменяют его напрямую.
Дополнительная информация
Документация
Обсуждения
- #601: Замечание по combineReducers, когда действие связано с несколькими редьюсерами
- #1400: Передача объекта состояния верхнего уровня дочернему редьюсеру — это антипаттерн?
- Stack Overflow: Доступ к другим частям состояния при использовании комбинированных редьюсеров?
- Stack Overflow: Сведение всего поддерева с помощью redux combineReducers
- Деление состояния между редьюсерами Redux
Должен ли я использовать оператор switch для обработки действий?
Нет. Вы можете использовать любой подход для ответа на действие в редьюсере. Оператор switch — это наиболее распространённый подход, но вы можете использовать операторы if, таблицу поиска функций или создать функцию, которая абстрагирует это. На самом деле, хотя Redux требует, чтобы объекты действий содержали поле type, логика вашего редьюсера даже не должна полагаться на это для обработки действия. Тем не менее, стандартный подход — использование оператора switch или таблицы поиска на основе type.
Дополнительная информация
Документация
Обсуждения
© 2015–2017 Dan Abramov
Licensed under the MIT License.
http://redux.js.org/docs/faq/Reducers.html