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 ""