1

我真的很喜欢干净的 APIthis.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()?可以使用字符串选择器,还是不赞成并且是不好的做法?

4

3 回答 3

5

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

  1. 使重构变得非常容易:假设您需要更改状态结构并且没有选择器,那么您最终可能会重构所有项目,包括视图组件。
  2. 允许derived data提取,您可以保持商店干净整洁,只保留重要数据并将推导留给选择器(假设您要显示购物车的总金额,因此您可以创建一个选择器来收集购物车中的所有产品并汇总他们的价格)。
于 2018-04-10T09:28:33.303 回答
1

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

总之,如果你有一个复杂的数据结构要处理,它们是非常必要的。

于 2018-04-10T08:15:10.453 回答
1

请注意,您可以将粗箭头函数传递给 store.select。所以代替这个:

this.store.select('媒体', '游戏');

做这个:

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

如果您想跳过整个 createSelector 内容,您可能最终会在组件中执行大量 combineLatest 和 withLatestFrom 以组合状态的不同部分。如果您使用大量这些 rxjs 运算符,则可能更适合引入 createSelector() 层。

于 2018-04-10T18:58:20.623 回答