如何处理apollo-link-state中的嵌套状态(类似于Redux的combineReducers)
How to deal with nested state in apollo-link-state (similar to Redux's combineReducers)
如果我们查看 todos example,假设应用程序有多个视图(一个 TodoList 页面和另一个页面)。
因此,在 state/store/cache 的顶层,它实际上只是一个具有某些自身状态的视图,而不是 "todos" 直接引用待办事项数组。
在该视图中,我们将定义待办事项列表和可见性过滤器 - 因此 state/store/cache 看起来不会像这样:
{
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 */}
}
}
它甚至可能在自己的数据中被隔离 "module",就像这里建议的那样: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 将有自己的缩减器,该缩减器组合在数据缩减器中,数据缩减器与键 "data" 组合在 TodoList 缩减器中。然后,TodoList reducer 将再次组合到场景 reducer 中,依此类推,直到顶部,以使嵌套状态反映项目的文件夹结构。
但是如果不在单个 "TodoList" 解析器中定义所有内容,使用 apollo-link-state 和解析器怎么可能呢?
附加问题:
离开后如何清除 TodoList 状态?在 Redux 中,我猜你会触发一个操作来清除给定的状态片段。
P.S.
"apollo-link-state" & "apollo-link" 标签在 Whosebug 中丢失。也许 rep > 1500 的人可以添加这些?
我也有同样的问题。似乎 apollo-link-state
期望在解析器的顶层有一个函数,因此不可能像在 Redux 存储中那样创建嵌套结构。
不过,正如 introduction post 所说,预计 apollo-link-state
只会管理大约 20% 的状态,其余的将从 GraphQL 服务器获取数据。因此,拆分本地状态可能没有意义,就像拆分 Redux 存储一样有意义。
目前,我已经决定为本地州的主要域名使用前缀。
如果我们查看 todos example,假设应用程序有多个视图(一个 TodoList 页面和另一个页面)。
因此,在 state/store/cache 的顶层,它实际上只是一个具有某些自身状态的视图,而不是 "todos" 直接引用待办事项数组。
在该视图中,我们将定义待办事项列表和可见性过滤器 - 因此 state/store/cache 看起来不会像这样:
{
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 */}
}
}
它甚至可能在自己的数据中被隔离 "module",就像这里建议的那样: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 将有自己的缩减器,该缩减器组合在数据缩减器中,数据缩减器与键 "data" 组合在 TodoList 缩减器中。然后,TodoList reducer 将再次组合到场景 reducer 中,依此类推,直到顶部,以使嵌套状态反映项目的文件夹结构。
但是如果不在单个 "TodoList" 解析器中定义所有内容,使用 apollo-link-state 和解析器怎么可能呢?
附加问题:
离开后如何清除 TodoList 状态?在 Redux 中,我猜你会触发一个操作来清除给定的状态片段。
P.S.
"apollo-link-state" & "apollo-link" 标签在 Whosebug 中丢失。也许 rep > 1500 的人可以添加这些?
我也有同样的问题。似乎 apollo-link-state
期望在解析器的顶层有一个函数,因此不可能像在 Redux 存储中那样创建嵌套结构。
不过,正如 introduction post 所说,预计 apollo-link-state
只会管理大约 20% 的状态,其余的将从 GraphQL 服务器获取数据。因此,拆分本地状态可能没有意义,就像拆分 Redux 存储一样有意义。
目前,我已经决定为本地州的主要域名使用前缀。