Согласно комментариям примера приложения:
/**
* Every reducer module exports selector functions, however child reducers
* have no knowledge of the overall state tree. To make them useable, we
* need to make new selectors that wrap them.
**/
Например, в reducers/collections.ts селекторы в нижней части файла ссылаются только на срез коллекции:
export const getLoaded = (state: State) => state.loaded;
export const getLoading = (state: State) => state.loading;
export const getIds = (state: State) => state.ids;
Эти селекторы коллекций нельзя использовать с state.select(), потому что state.select предполагает работу со всем AppState. Поэтому в reducers/index.ts селектор затем оборачивается другим селектором, чтобы он работал со всем AppState:
export const getCollectionLoading = createSelector(getCollectionState, fromCollection.getLoading);
Вернемся к вашему вопросу: зачем для этого нужно использовать reselect. Повторный выбор в этом случае не обеспечивает никакой оптимизации. Таким образом, основная цель повторного выбора заключается в том, что он предоставляет возможность создавать селекторы вместе.
Используя эту функцию композиции, мы можем сделать так, чтобы в collections.ts были селекторы только для среза коллекций. Тогда в index.ts у нас могут быть селекторы на уровне AppState. Кроме того, у нас могут быть селекторы, которые работают с разными сегментами магазина, например, этот:
/**
* Some selector functions create joins across parts of state. This selector
* composes the search result IDs to return an array of books in the store.
*/
export const getSearchResults = createSelector(getBookEntities,
getSearchBookIds, (books, searchIds) => {
return searchIds.map(id => books[id]);
});
person
seescode
schedule
29.06.2017