3

我试图理解RANGE_ADD。我已经提供了突变配置, for RANGE_ADD,以及所有必需的信息。我使用viewer命名约定,我的连接嵌套在viewer. 下面是我完整的中继突变的样子......

import Relay from "react-relay";

export default class CreateTeamMutation extends Relay.Mutation {
  static fragments = {
    viewer: () => Relay.QL`
      fragment on Viewer {
        id
      }
    `
  }

  getMutation() {
    return Relay.QL`
      mutation { createTeam }
    `;
  }

  getVariables() {
    return {
      name: this.props.name
    };
  }

  getFatQuery() {
    return Relay.QL`
      fragment on CreateTeamPayload {
        edge,
        viewer {
          teams
        }
      }
    `;
  }

  getConfigs() {
    console.log(this.props.viewer);
    return [{
      type: "RANGE_ADD",
      edgeName: "edge",
      parentID: this.props.viewer.id,
      parentName: "viewer",
      connectionName: "teams",
      rangeBehaviors: {
        "": "append"
      }
    }];
  }
};

我为viewerid 提供了一个片段,在运行时getConfigs,我可以看到该片段存在。

在 GraphQL 突变响应负载中,提供CreateTeamPayload了该viewer字段,以便 Relay 可以利用突变配置中的连接RANGE_ADD。此外,在 内CreateTeamPayload,新边被提供为edge

这三位信息(父级的查看器 ID、连接信息和边缘)似乎就是所有RANGE_ADD要求。我还确保通过 fat 查询从服务器请求这些数据,以便 Relay 可以访问它以进行突变配置。

不过,中继似乎不包括我在胖查询中指定的内容,以及突变配置所需的内容,以及它分派到服务器的内容。Relay 所要求的只是clientMutationId. 这是 Relay 发出的请求...

{
  "query": "mutation CreateTeamMutation($input_0:CreateTeamInput!){createTeam(input:$input_0){clientMutationId}}",
  "variables": {
    "input_0": {
      "name": "foo bar",
      "clientMutationId": "0"
    }
  }
}

并且,以连锁反应的方式,这会导致 Relay引发错误,他期望viewerand用于突变配置。edge

Warning: writeRelayUpdatePayload(): Expected response payload to include the newly created edge `edge` and its `node` field. Did you forget to update the `RANGE_ADD` mutation config?

如果 Relay 包含这些必填字段,则它们完全可以存在。是否RANGE_ADD必须伴随REQUIRED_CHILDREN才能工作?突变通过服务器,并在服务器上创建记录,只是客户端突变配置未能将更改的数据合并到存储中。

4

1 回答 1

2

这可能是一个模棱两可的警告:https ://github.com/facebook/relay/issues/542

中继将范围行为与先前获取的连接相交。

您在此处的范围行为仅定义了当团队连接不受任何呼叫影响时要执行的操作。您如何在应用程序中调用您的团队连接?

例如,如果您的应用 fetches teams(order_by: 'recent'),您应该定义一个像这样的范围行为'orderby(recent)': 'append'

于 2016-01-08T01:22:22.570 回答