为什么在这个@ngrx示例中需要重新选择createSelector?

时间:2017-06-24 21:58:51

标签: ngrx reselect ngrx-store

以下代码段的作用是什么?它取自file

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

fromCollection.getLoading只有truefalse值,因此使用createSelector可以实现任何优化吗?

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

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

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

2 个答案:

答案 0 :(得分:12)

根据示例应用程序的评论:

/**
 * 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);

回到你的问题:为什么有必要使用重新选择。在这种情况下重新选择并不提供任何优化。所以重新选择的主要目的是它提供了将选择器组合在一起的能力。

通过使用此合成功能,我们可以使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]);
});

答案 1 :(得分:1)

是的,可能会有性能提升。如果 $(document).ready(function() { $("a:regex(id,add-item-[0-9]+)").click(function(event) { event.preventDefault(); var link = $(this).attr("href"); $.ajax({ url: link, method: "GET", dataType: "json", success: function(data) { $('#notice-modal').modal('show'); if(data.quantity) { $("#cart-item-count").css('display', 'block'); $("#cart-item-count").html(data.quantity); } else { $("#cart-item-count").hide() } } }); }) }); 计算成本很高,重新选择将避免无用的重新计算,直到fromCollection.getLoading保持返回相同的值。