【问题标题】:How to update multiple nodes in the local graph with one mutation result如何用一个突变结果更新本地图中的多个节点
【发布时间】:2016-09-02 14:33:19
【问题描述】:

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

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

换句话说:

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

【问题讨论】:

    标签: relayjs


    【解决方案1】:

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

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

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

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

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

    getFatQuery() 函数中,我们指定viewertodoscompletedCount 字段应在商店中获取和更新。 todo要在store中更新的字段在fragments或者fat查询中指定。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 2018-05-27
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2020-09-13
      相关资源
      最近更新 更多