В @ngrx/store есть три основных строительных блока для управления глобальным состоянием: действия, редьюсеры и селекторы. Для конкретного feature хранилища мы создаем редьюсер reducer для обработки смены состояния хранилища (которое вызывается с помощью действий actions) и селекторов selectors для получения фрагментов feature хранилища. Также нам нужно определить название (ключ) name редьюсера, необходимое для регистрации feature редьюсера в хранилище NgRx. Таким образом, мы можем рассматривать feature NgRx как объединение имени редьюсера, функции редьюсера и селекторов для конкретного состояния редьюсера.
Функция createFeature сокращает количество повторяющихся селекторов в коде, автоматически генерируя селектор хранилища и дочерние селекторы для каждого свойства состояния хранилища. В качестве входного аргумента она принимает объект, содержащий имя и редьюсер:
import{createFeature,createReducer,on}from'@ngrx/store';import{Book}from'./book.model';import*asBookListPageActionsfrom'./book-list-page.actions';import*asBooksApiActionsfrom'./books-api.actions';interfaceState{books:Book[];loading:boolean;}constinitialState:State={books:[],loading:false,};exportconstbooksFeature=createFeature({name:'books',reducer:createReducer(initialState,on(BookListPageActions.enter,(state)=>({...state,loading:true,})),on(BooksApiActions.loadBooksSuccess,(state,{books})=>({...state,books,loading:false,})),),});exportconst{name,// название хранилищаreducer,// редьюсер хранлищаselectBooksState,// селектор для всего хранлищаselectBooks,// селектор для свойства `books`selectLoading,// селектор для свойства `loading`}=booksFeature;
Объект, созданный с помощью функции createFeature, содержит имя, редьюсер, селектор всего хранилища и селектор для каждого свойства состояния хранилища. Все созданные селекторы имеют префикс select, а селектор хранилища - суффикс State. В этом примере имя селектора для хранилища - selectBooksState, где books - имя свойства. Имена дочерних селекторов - selectBooks и selectLoading - основаны на именах свойств состояния хранилища books.
Созданные селекторы можно использовать как самостоятельно, так и для создания других селекторов:
Функция createFeature так же может быть использована для предоставления дополнительных селекторов для состояния хранилища с помощью опционального метода extraSelectors:
Метод extraSelectors это функция, которая принимает селекторы в качестве входных аргументов и возвращает объект со всеми дополнительными селекторами. Мы можем добавлять столько дополнительных селекторов, сколько нам нужно.
Повторное использование дополнительных селекторов¶
Повторное использование дополнительных селекторов можно сделать следующим образом:
Регистрация feature хранилища в глобальном состоянии может быть выполнена путем передачи как аргумента всего объекта feature в метод StoreModule.forFeature:
Функция createFeature не может быть использована для функций, состояние которых содержит необязательные свойства. Другими словами, все свойства состояния должны быть переданы в начальный объект состояния.
Каждый необязательный символ (?) должен быть заменен на | null или | undefined:
books.reducer.ts
1 2 3 4 5 6 7 8 91011
interfaceState{books:Book[];activeBookId:string|null;// или activeBookId: string | undefined;}constinitialState:State={books:[],activeBookId:null,// или activeBookId: undefined,};