NGRX 根/全局状态与交叉选择功能状态

Emp*_*eol 5 ngrx angular

假设我们有一个应用程序,其中包含比赛日程、球员、球队等部分。您将如何构建您的应用程序/功能状态?

\n\n

我最初的想法是将它们分解为功能状态/模块:

\n\n
app/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 games/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 store/\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 games.module.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 players/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 store/\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 players.module.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 teams/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 store/\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 teams.module.ts\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 app.module.ts\n
Run Code Online (Sandbox Code Playgroud)\n\n

每个功能负责每种类型数据(游戏、球员、球队)的 CRUD 方法。

\n\n

但就游戏而言,您需要列出哪些球队参加过比赛...并且您可能只在游戏状态中存储对每个球队的引用:

\n\n
games: {\n  game1Id: {\n    home: team1Id,\n    away: team2Id,\n  }\n  ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

类似地,对于查看球队,您将希望查看与球队关联的球员...并且,可能只存储对每个球队的playerIds的引用。

\n\n

这些状态/数据中的每一个是否真的应该处于全局状态而不是每个功能模块可以从“自上而下”方法中选择它们的功能状态?功能模块结构是否有意义?

\n\n

或者“跨越”功能模块/状态是否可以接受?

\n\n

或者还有其他我没有考虑过的方法?

\n

tim*_*ver 3

像往常一样,这取决于。

就我个人而言,我想说,如果你可以将它分成不同的减速器甚至功能 - 那就去做吧。

减速器只知道它的状态而不是整个应用程序状态,有多种方法可以访问应用程序状态的不同部分:

  • 将其添加到您的分派操作中
  • 创建一个处理这两种状态的减速器,使用 redux 所谓的“case 函数”减速器

例如:

switch (action.type) {
   case "FOO":
     return fooReducer(state, action);
   case "BAR":
     return barReducer(state, action);
   default:
     return state;
}
Run Code Online (Sandbox Code Playgroud)

要创建视图模型,如果您使用选择器,您确实可以跨功能模块/状态进行访问。例如,您可以创建一个组合来自不同模块的多个较小选择器的选择器。

更多信息: 在模块之间共享数据是小菜一碟 Redux 文档