【发布时间】:2016-09-02 14:33:19
【问题描述】:
假设有一个突变会更新多个节点服务器端。
让 Relay 更新本地存储中的节点的首选方式是什么?
换句话说:
是否可以返回更新节点的列表并告诉 Relay 为每个返回的节点应用某种 FIELDS_CHANGE?
【问题讨论】:
标签: relayjs
假设有一个突变会更新多个节点服务器端。
让 Relay 更新本地存储中的节点的首选方式是什么?
换句话说:
是否可以返回更新节点的列表并告诉 Relay 为每个返回的节点应用某种 FIELDS_CHANGE?
【问题讨论】:
标签: relayjs
是的,可以更新多个节点并让 Relay 相应地更新其客户端存储。有两种情况:
每个更改的节点不需要使用FIELDS_CHANGE mutator 配置单独更新。我们只需要用FIELDS_CHANGE 更新这些节点的父节点。应该获取和更新的子字段在 fat 查询中指定。
一个很好的例子是 Relay 的待办事项示例的 MarkAllTodosMutation,其中 viewer 是 todos 连接类型(todo 节点)的父级。由于这个突变改变了viewer下的多个节点,所以在getConfig()函数中,我们指定viewer应该被更新:
getConfigs() {
return [{
type: 'FIELDS_CHANGE',
fieldIDs: {
viewer: this.props.viewer.id,
},
}];
}
在getFatQuery() 函数中,我们指定viewer 的todos 和completedCount 字段应在商店中获取和更新。 todo要在store中更新的字段在fragments或者fat查询中指定。
getFatQuery() {
return Relay.QL`
fragment on MarkAllTodosPayload @relay(pattern: true) {
viewer {
completedCount,
todos,
},
}
`;
}
在客户端突变上,要更新的节点作为道具传递给突变。在getConfig()函数中,每个节点都需要配置FIELDS_CHANGE。 getFatQuery 函数指定应在存储中更新已更改节点的哪些字段。理想情况下,它应该包含所有可能受该突变影响的字段。
【讨论】: