如何使用一个突变结果更新本地图中的多个节点

时间:2016-05-07 16:01:41

标签: relayjs

让我们说有一个突变可以更新多个节点服务器端。

让Relay更新本地存储中的节点的首选方法是什么?

换句话说:

是否可以返回更新节点列表并告诉Relay为每个返回的节点应用某种FIELDS_CHANGE?

1 个答案:

答案 0 :(得分:0)

是的,可以更新多个节点并让Relay相应地更新其客户端存储。有两种情况:

1)更新的节点属于同一父节点:

每个更改的节点不需要使用FIELDS_CHANGE mutator配置单独更新。我们只需要使用FIELDS_CHANGE更新这些节点的父节点。应该获取和更新的子字段在胖查询中指定。

一个很好的例子是Relay的todo示例的MarkAllTodosMutation,其中viewertodos连接类型(todo节点)的父级。由于此突变会更改viewer下的多个节点,因此在getConfig()函数中,我们指定应更新viewer

getConfigs() {
  return [{
    type: 'FIELDS_CHANGE',
    fieldIDs: {
      viewer: this.props.viewer.id,
    },
  }];
}

getFatQuery()函数中,我们指定应在商店中提取并更新todos completedCountviewer字段。要在商店中更新的todo字段在fragments或胖查询中指定。

getFatQuery() {
  return Relay.QL`
    fragment on MarkAllTodosPayload @relay(pattern: true) {
      viewer {
        completedCount,
        todos,
      },
    }
  `;
}

2)更新的节点属于不同的父节点:

在客户端突变中,要更新的节点作为道具传递给突变。在getConfig()函数中,每个节点都需要配置FIELDS_CHANGEgetFatQuery函数指定应在商店中更新已更改节点的哪些字段。理想情况下,它应该包含可能受该突变影响的所有字段。