Reducers¶
NgRx Reducers являются чистыми функциями и отвечают за смену состояния хранилища в Angular приложении в ответ на возникновение действия, при этом каждый редюсер может изменять только определенную часть состояния.
Изменить состояние в NgRx можно ТОЛЬКО с использованием редюсеров.
users.actions.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
users.reducer.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
Любое действие, отправляемое в хранилище методом dispatch()
, передается всем редюсерам, каждый из которых либо изменяет состояние согласно текущему действию, либо возвращает состояние нетронутым, если обработка такого действия в нем не предусмотрена.
Все изменения состояния хранилища происходят в Angular приложении синхронно, а их порядок зависит от порядка регистрации самих NgRx Reducers.
Редюсер принимает два аргумента:
- часть текущего состояния, за обработку которого он ответственен;
- обрабатываемое действие.
Поскольку все NgRx Reducers обрабатывают определенный набор действий и всегда должны возвращать состояние, здесь очень удобно применение оператора switch
.
При первом вызове редюсера в качестве значения состояния ему передается undefined
, поэтому очень важно определить значение части хранилища по умолчанию, которое задаст необходимую структуру и, если это необходимо, исходные значения свойств этой структуры.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Для содержания кода вашего Angular проекта в чистоте и во избежании путаницы, рекомендуется NgRx Reducers и обрабатываемые ими действия хранить в разных файлах. Подробно здесь.
В приложении регистрация NgRx Reducers осуществляется с помощью метода forRoot()
модуля StoreModule
.
1 2 3 |
|
Методу должен передаваться объект, ключами которого являются имена частей, формирующих глобальное хранилище, а их значениями — редюсеры, возвращающие значение этих частей хранилища.