Обе библиотеки стремятся управлять состоянием, которым манипулируют только определенными, предопределенными способами; редукторы - это доступ, который они предоставляют государству.
Ограничивая способность напрямую манипулировать состоянием, они облегчают понимание того, как достигнуто определенное состояние; всегда можно достичь определенного состояния, отправляя те же самые действия снова, и данное состояние может быть достигнуто только в результате действий, отправленных состоянию (по крайней мере, это идеал - нечистые * редукторы потенциально могут привести к другому состояния, достигаемые от тех же действий).
Если мы представим менеджера состояний, который позволяет функциям манипулировать состоянием, что требуется для возврата измененной версии исходного состояния, то будет гораздо сложнее понять, как было достигнуто данное состояние, так как хранилищем можно было управлять в любой точке любой функцией.
Эта статья дает хороший обзор ключевых идей, стоящих за приставкой, и объясняет , почему redux делает то, что делает. Вот соответствующие части для вашего вопроса:
Состояние только для чтения
Единственный способ изменить состояние - это создать действие, объект, описывающий произошедшее.
Это гарантирует, что ни представления, ни сетевые обратные вызовы никогда не будут писать напрямую в состояние. Вместо этого они выражают намерение преобразовать государство. Поскольку все изменения централизованы и происходят один за другим в строгом порядке, не существует тонких расовых условий, на которые стоит обратить внимание. Поскольку действия являются просто обычными объектами, их можно регистрировать, сериализовать, хранить и затем воспроизводить для целей отладки или тестирования.
Изменения производятся с использованием чистых функций
Чтобы указать, как дерево состояний преобразуется с помощью действий, вы пишете чистые редукторы.
Редукторы - это просто чистые функции, которые принимают предыдущее состояние и действие и возвращают следующее состояние. Не забудьте возвращать новые объекты состояния, вместо того, чтобы поменять предыдущее состояние. Вы можете начать с одного редуктора и по мере роста вашего приложения разделить его на более мелкие редукторы, которые управляют определенными частями дерева состояний. Поскольку редукторы - это просто функции, вы можете контролировать порядок их вызова, передавать дополнительные данные или даже создавать многоразовые редукторы для общих задач, таких как нумерация страниц.
У меня гораздо меньше опыта работы с ngrx, хотя, похоже, это магазин в стиле редукса, я предполагаю, что он более или менее соответствует тем же принципам. Я был бы рад оказаться неправым, и в этом случае я могу обновить этот ответ.
* Функция нечистой функции будет выполнять одно или несколько из следующих действий:
- Состояние доступа, отличное от переданных аргументов
- Манипулировать аргументами, которые были переданы
- Содержит побочный эффект - то, что влияет на состояние вне его