我非常喜欢this.store.select('media', 'games');
我不需要使用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()
是否合适?是否可以使用字符串选择器,还是不赞成并且是不好的做法?
答案 0 :(得分:4)
selector
的概念不仅对于记忆目的非常有用,虽然它似乎可以添加不必要的脚手架,但对于大型项目来说它变得非常重要:
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()层可能更合适。