让我们说有一个突变可以更新多个节点服务器端。
让Relay更新本地存储中的节点的首选方法是什么?
换句话说:
是否可以返回更新节点列表并告诉Relay为每个返回的节点应用某种FIELDS_CHANGE?
答案 0 :(得分:0)
是的,可以更新多个节点并让Relay相应地更新其客户端存储。有两种情况:
每个更改的节点不需要使用FIELDS_CHANGE
mutator配置单独更新。我们只需要使用FIELDS_CHANGE
更新这些节点的父节点。应该获取和更新的子字段在胖查询中指定。
一个很好的例子是Relay的todo示例的MarkAllTodosMutation
,其中viewer
是todos
连接类型(todo
节点)的父级。由于此突变会更改viewer
下的多个节点,因此在getConfig()
函数中,我们指定应更新viewer
:
getConfigs() {
return [{
type: 'FIELDS_CHANGE',
fieldIDs: {
viewer: this.props.viewer.id,
},
}];
}
在getFatQuery()
函数中,我们指定应在商店中提取并更新todos
completedCount
个viewer
字段。要在商店中更新的todo
字段在fragments
或胖查询中指定。
getFatQuery() {
return Relay.QL`
fragment on MarkAllTodosPayload @relay(pattern: true) {
viewer {
completedCount,
todos,
},
}
`;
}
在客户端突变中,要更新的节点作为道具传递给突变。在getConfig()
函数中,每个节点都需要配置FIELDS_CHANGE
。 getFatQuery
函数指定应在商店中更新已更改节点的哪些字段。理想情况下,它应该包含可能受该突变影响的所有字段。