代码之家  ›  专栏  ›  技术社区  ›  Soren

如何处理apollo链接状态中的嵌套状态(类似于Redux的CombineReducer)

  •  12
  • Soren  · 技术社区  · 7 年前

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

    因此,在状态/存储/缓存的顶层,它实际上只是一个具有自己一些状态的视图,而不是“todo”直接引用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,它与数据reducer结合在一起,数据reducer与键“data”结合在一起。然后,TodoList reducer将再次组合到scenes reducer中,依此类推到顶部,以使嵌套状态反映项目的文件夹结构。

    但是,如果不在一个“TodoList”解析器中定义所有内容,阿波罗链接状态和解析器怎么可能出现这种情况呢?

    其他问题:

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

    附笔。

    “阿波罗链接状态” & “阿波罗链接” stackoverflow中缺少标记。可能是具有rep>1500能加上这些吗?

    1 回复  |  直到 6 年前
        1
  •  6
  •   Christophe Noël    7 年前

    我有同样的问题。看来 apollo-link-state 应该在解析器的顶层使用函数,因此不可能像在Redux存储中那样创建嵌套结构。

    作为 introduction post 尽管如此,预计 阿波罗链路状态 将只管理大约20%的状态,其余的从GraphQL服务器获取数据。因此,拆分本地州可能没有拆分Redux商店那么有意义。

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

    推荐文章