@ ngrx / store createSelector()真的有必要吗?

时间:2018-04-09 21:58:52

标签: angular ngrx ngrx-store ngrx-effects ngrx-store-4.0

我非常喜欢this.store.select('media', 'games');

的干净API

我不需要使用createSelector()创建任何选择器,也不需要导入任何内容。当项目变大时,我觉得选择者成为了这个伟大的中间层。 media.selectors.ts成为一个整体文件。

我最终让很多选择器做了简单的事情,而不是:

this.store.select('media', 'games');

我做:

import * as fromMedia '../media'

this.store.select(fromMedia.getAllGamesSelector());

例如movies同上:

import * as fromMedia '../media'

this.store.select(fromMedia.getAllMoviesSelector());

我理解createSelector()有记忆的好处,但我非常怀疑用strings进行简单的选择会慢得多......

我阅读的每本指南都要求您必须使用createSelector()

所以我的问题是,何时使用createSelector()是否合适?是否可以使用字符串选择器,还是不赞成并且是不好的做法?

3 个答案:

答案 0 :(得分:4)

selector的概念不仅对于记忆目的非常有用,虽然它似乎可以添加不必要的脚手架,但对于大型项目来说它变得非常重要:

  1. 让重构变得非常简单:想象一下,您需要更改状态结构而没有选择器,那么您可能最终会重构所有项目,包括查看组件。
  2. 允许derived data提取,您可以保持商店干净整洁,只保留重要数据并将衍生物留给选择者(想象您想要显示购物车的总金额,所以您可以创建一个选择器,收集购物车中的所有产品并汇总其价格。

答案 1 :(得分:1)

memoization并非createSelector()带给您的唯一好处。 想象一下,有一个复杂的嵌套数据结构。您必须遍历数据才能找到所需的属性。 使用selectors,您可以轻松引用数据结构的各个部分,将它们合并,合并它们,然后将它们发送到您的组件以供使用。

在结论中,如果你有一个复杂的数据结构要处理,它们确实是必要的。

答案 2 :(得分:1)

请注意,您可以将胖箭头函数传递给store.select。所以不要这样:

  

this.store.select('media','games');

这样做:

  

this.store.select(state => state.media.games);

如果你想跳过整个createSelector的东西,你最终可能会在你的组件中做很多combineLatest和withLatestFrom,以便结合不同的状态部分。如果你使用很多rxjs运算符,那么引入createSelector()层可能更合适。