Перейти к основному содержимому

Редьюсеры

Неофициальный Бета-перевод

Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →

Redux FAQ: Редьюсеры

Как обмениваться состоянием между двумя редьюсерами? Обязательно ли использовать combineReducers?

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

Многие разработчики пытаются обмениваться данными между редьюсерами, но обнаруживают, что combineReducers это запрещает. Доступны следующие подходы:

  • Если редьюсеру нужны данные из другого среза состояния, реорганизуйте структуру дерева так, чтобы один редьюсер обрабатывал больше данных.

  • Реализуйте кастомные функции обработки действий. Это может потребовать замены combineReducers на собственный корневой редьюсер. Также можно использовать утилиты вроде reduce-reducers: combineReducers обрабатывает большинство действий, а специализированный редьюсер — кросс-срезовые действия.

  • Middleware с асинхронной логикой (например, redux-thunk) получают полное состояние через getState(). Action creator может извлекать дополнительные данные из состояния и помещать их в действие, предоставляя каждому редьюсеру достаточно информации для обновления своего среза.

Помните: редьюсеры — просто функции. Организуйте их как угодно, дробите на мелкие переиспользуемые функции («композиция редьюсеров»). При необходимости передавайте кастомный третий аргумент из родительского редьюсера, если дочернему нужны дополнительные данные. Главное — соблюдать базовые правила: (state, action) => newState и иммутабельное обновление состояния.

Дополнительные материалы

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

Обсуждения

Обязательно ли использовать оператор switch для обработки действий?

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

Дополнительные материалы

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

Обсуждения