如何处理apollo-link-state中的嵌套状态(类似于Redux的combineReducers)

时间:2018-01-02 16:43:13

标签: apollo react-apollo apollo-client apollo-link-state

如果我们查看todos example,假设应用程序有多个视图(TodoList页面和另一个页面)。

所以不是" todos"直接引用todo项的数组,在状态/存储/缓存的顶层,它实际上只是一个具有某些自身状态的视图。

在该视图中,我们定义了待办事项列表和可见性过滤器 - 因此状态/存储/缓存不会如下所示:

{
  todos: [TodoItem]
  0:▾TodoItem:0
  completed: false
  id: 0
  text: "hh"
  visibilityFilter: "SHOW_ALL"
}

但是:

{ 
  scenes: {
    TodoList: {
      todos: [TodoItem]
      0:▾TodoItem:0
      completed: false
      id: 0
      text: "hh"
      visibilityFilter: "SHOW_ALL"
    },
    SomeOtherView: { /* other state */}
  }
}

它甚至可能被孤立在自己的数据"模块"中,就像这里提出的那样:https://medium.com/@alexmngn/how-to-use-redux-on-highly-scalable-javascript-applications-4e4b8cb5ef38

{ 
  scenes: {
    TodoList: {
      data: {
        todos: [TodoItem]
        0:▾TodoItem:0
        completed: false
        id: 0
        text: "hh"
      }
      visibilityFilter: "SHOW_ALL"
    },
    SomeOtherView: { /* other state */}
  }
}

应用程序范围的状态将进一步存储一个级别:

{
  // App global state lives as long as the app
  data: { /* App global relevant data */},
  someglobalstate: true, 
  scenes: {
    TodoList: { // "view state" lives as long as the view is active, and resets when navigated away from
      data: {
        todos: [TodoItem]
        0:▾TodoItem:0
        completed: false
        id: 0
        text: "migrate from redux to apollo-link-state"
      }
      visibilityFilter: "SHOW_ALL"
    },
    SomeOtherView: { /* other state */}
  }
}

我们可以使用Redux中的reducer组合轻松实现这一点,如下所示:

从内部开始:todos将有自己的reducer,它在数据缩减器中组合,在TodoList reducer中与key" data"组合在一起。然后TodoList简化器将再次组合在场景缩减器中,依此类推到顶部,以使嵌套状态反映项目的文件夹结构。

但是如果没有在单个" TodoList"中定义所有东西,那么apollo-link-state和resolvers怎么可能这样呢?分解器?

其他问题:

一旦您离开,您将如何清除TodoList状态?在Redux中,我想你会触发一个清除状态的给定切片的动作。

P.S。

" apollo-link-state" & stackoverflow中缺少" apollo-link" 标记。也许有人代表> 1500可以添加那些?

1 个答案:

答案 0 :(得分:6)

我有同样的问题。似乎apollo-link-state期望在解析器的顶层有一个函数,因此不可能像在Redux存储中那样创建嵌套结构。

正如introduction post所说,预计apollo-link-state只管理大约20%的状态,其余的是从GraphQL Server获取数据。因此,将本地状态拆分为拆分Redux存储区的意义可能没有意义。

目前,我已经决定使用本地主要域名的前缀。