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