如何用一个突变结果更新局部图中的多个节点



假设有一个突变会更新多个节点服务器端。

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

换句话说:

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

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

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

每个改变后的节点不需要使用CCD_ 1突变体配置单独更新。我们只需要用FIELDS_CHANGE更新这些节点的父节点。应该获取和更新的子字段是在fat查询中指定的。

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

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

FIELDS_CHANGE0函数中,我们指定viewertodoscompletedCount字段应在存储中提取和更新。要在商店中更新的todo的字段在fragments或fat查询中指定。

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

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

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

最新更新