【问题标题】:NGRX root/global state vs cross selecting feature statesNGRX 根/全局状态与交叉选择特征状态
【发布时间】:2018-11-19 21:48:55
【问题描述】:

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

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

app/
├── games/
│   ├── store/
│   └── games.module.ts
├── players/
│   ├── store/
│   └── players.module.ts
├── teams/
│   ├── store/
│   └── teams.module.ts
└── app.module.ts

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

但在比赛的情况下,您会想要列出哪些球队参加过比赛......而且您可能只存储了对比赛状态中每个球队的引用:

games: {
  game1Id: {
    home: team1Id,
    away: team2Id,
  }
  ...
}

与查看球队类似,您需要查看与球队相关联的球员...同样,可能只存储了对每个球队的 playerIds 的引用。

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

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

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

【问题讨论】:

    标签: angular ngrx


    【解决方案1】:

    像往常一样,这取决于。

    就个人而言,我想说,如果您可以将其拆分为不同的减速器甚至功能,那就去吧。

    reducer 只知道它的状态而不是整个 appstate,有一些方法可以访问 app state 的不同部分:

    • 将其添加到已调度的操作中
    • 创建一个处理这两种状态的 reducer,redux 称之为“case 函数”reducer

    例如:

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

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

    更多信息: Sharing data between modules is peeanuts The Redux Docs

    【讨论】:

      猜你喜欢
      • 2018-12-05
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      • 2018-07-06
      • 2019-01-10
      • 2018-05-02
      • 1970-01-01
      • 2022-06-18
      相关资源
      最近更新 更多