Redux FAQ: Редюсеры

Содержание

Редюсеры

Как мне передавать состояние(state) между двумя редюсерами? Должен ли я использовать combineReducers?

Рекомендуемая структура Redux хранилища — это разделение объекта состояния на несколько “частей” или “областей” по ключу, и предоставление отдельной функции-редюсера для управления каждой частью данных. Это похоже на то, как стандартная Flux структура имеет несколько независимых хранилищ, а Redux предоставляет утилиту комбинация редюсеров (combineReducers) для упрощения реализации этого подхода. Однако, важно заметить, что комбинация редюсеров необязательна — это просто функция для совместного использования имеющихся редюсеров (по одному на каждую часть состояния) с простыми JavaScript-объектами для данных.

У многих пользователей возникает необходимость реализовать обмен данными между двумя редюсерами, но комбинация редюсеров не позволяет им сделать это. Существует несколько подходов для решения этой задачи:

  • Если редюсеру нужны данные из другой части состояния, то дерево состояния требуется переорганизовать так, чтобы один редюсер охватывал больше данных.
  • Вам может понадобиться написать некоторые стандартные функции для обработки некоторых из этих действий. Это требует обязательной замены комбинации редюсеров на Вашу собственную функцию-редюсер верхнего порядка. Вы также можете использовать такие утилиты, как reduce-reducers, для запуска комбинации редюсеров для обработки большинства действий, но также можно запустить более специализированный редюсер для конкретных действий, который скрещивает части состояния.
  • Асинхронные генераторы действий, такие как redux-thunk, имеют доступ ко всему состоянию через getState(). Генератор действий может извлечь дополнительные данные из состояния и передать их в действие, таким образом, каждый редюсер имеет достаточно информации для обновления своей части состояния.

В общем, помните, что редюсеры — это всего лишь функции. Вы можете организовать их и разделить по своему усмотрению, и вам следует разбить их на более мелкие переиспользуемые функции (“композиция редюсеров”). Пока Вы это делаете, Вы можете передавать в нестандартном третьем аргументе необходимые для вычисления следующего состояния дополнительные данные от родительского редюсера к дочернему. Только Вам надо убедиться, что соблюдается главное правило редюсеров: (state, action) => newState, и состояние не изменяется напрямую.

Дополнительная информация

Документация

Обсуждения

Должен ли я использовать оператор switch для обработки действий(actions)

Нет, вы можете использовать любой подход, с помощью которого вы бы хотели реагировать на действие в редюсере. Оператор switch является наиболее распространенным подходом, но так же отлично подойдет и оператор if, таблица соответствия функций или создание функции, которая абстрагирует все это. На самом деле, пока Redux требует, чтобы объект действия содержал поле type, логике вашего редюсера даже не придется полагаться на то, чтобы управлять действием. Тем не менее, стандартный подход, безусловно, с помощью инструкции switch или таблицы поиска, основанной на type.

Дополнительная информация

Документация

Обсуждения

results matching ""

    No results matching ""