Почему в этом примере с @ngrx необходим повторный выбор createSelector?

Что делает следующий фрагмент кода? Он взят из этого файла.

export const getCollectionLoading = createSelector(getCollectionState, fromCollection.getLoading);

fromCollection.getLoading имеет только значение true или false, поэтому можно ли добиться какой-либо оптимизации с помощью createSelector?

in

export const getCollectionLoaded = createSelector(getCollectionState, fromCollection.getLoaded);

export const getCollectionLoading = createSelector(getCollectionState, fromCollection.getLoading);

export const getCollectionBookIds = createSelector(getCollectionState, fromCollection.getIds);

person wonderful world    schedule 24.06.2017    source источник


Ответы (2)


Согласно комментариям примера приложения:

/**
 * 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
comment
Являются ли функции createSelector, добавляющие функциональность, похожей на повторный выбор, библиотеку Selector для Redux, предоставляя мемоизированные селекторы? - person ramon22; 07.10.2017
comment
В коде, который я связал с ним, используется reselect.js. Я предполагаю, что ваш вопрос касается ngrx 4, где он поставляется с createSelector из коробки. Да, версия createSelector для ngrx 4 обеспечивает ту же поддержку мемоизированных селекторов, что и reselect.js: github.com/ngrx/platform/blob/master/docs/store/selectors.md - person seescode; 08.10.2017

Да, может быть прирост производительности. Если вычисление fromCollection.getLoading является дорогостоящим, повторный выбор позволит избежать бесполезных пересчетов, пока getCollectionState не будет возвращать одно и то же значение.

person Andrea Carraro    schedule 24.06.2017