【问题标题】:Relay mutation fragments intersection中继突变片段相交
【发布时间】:2017-01-21 07:53:55
【问题描述】:

我不使用 Relay 容器,因为我想对组件有更多的控制权。而不是它,我使用 HOC + Relay.Store.forceFetch,它使用变量获取任何给定的查询。所以我有以下查询:

query {
    root {
      search(filter: $filter) {
        selectors {
          _id,
          data {
            title,
            status
          }
        },
        selectorGroups {
          _id,
          data {
            title,
          }
        }
      }
  }
}

然后我必须对selector 类型进行一些突变。

export default class ChangeStatusMutation extends Relay.Mutation {
  getMutation() {
    return Relay.QL`mutation {selectors_status_mutation}`;
  }
  getVariables() {
    return {
      id: this.props.id,
      status: this.props.status
    };
  }
  getFatQuery() {
    return Relay.QL`
      fragment on selectors_status_mutationPayload{
        result {
          data {
            status
          }
        }
      }
    `;
  }
  static fragments = {
    result: () => Relay.QL`
      fragment on selector {
        _id,
        data {
          title,
          status
        }
      }`,
  };

  getOptimisticResponse() {
    return {
      result: {
        _id: this.props.id,
        data: {
          status: this.props.status
        }
      }
    };
  }

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

在组件中调用突变:

const mutation = new ChangeStatusMutation({id, status, result: selector});
Relay.Store.commitUpdate(mutation);

Relay 存储中的突变承诺选择器未更改。我猜这是因为空的Tracked Fragment Query 并且突变执行时没有任何字段:

ChangeStatusMutation($input_0:selectors_statusInput!) {
  selectors_status_mutation(input:$input_0) {
    clientMutationId
  }
}

但是 Relay 已经获取了修改选择器,我将它传递给带有 props 的突变。所以 Relay 知道应该更改的类型、如何找到项目以及应该替换哪些字段。但不能相交。怎么了?

【问题讨论】:

    标签: graphql relayjs relay


    【解决方案1】:

    所以,通过避免使用 Relay 容器,你肯定有点“离群索居”,但我认为这仍然可以工作......

    Relay 通过查找FIELDS_CHANGE 配置指示的节点来执行查询交集。在这种情况下,您的 fieldIDs 将其指向 ID 为 this.props.idresult 节点。

    您确定您的商店中有具有该 ID 的节点吗?我注意到在您的forceFetch 查询中,您获取了某种替代_id,但实际上并未获取id。 Relay 需要一个 id 字段出现在您以后想要重新获取或使用声明性变异 API 的任何内容上......

    我会首先检查您发送的查询以获取 result 类型的任何内容。我没有看到您在问题描述中的任何地方获取该内容,所以我只是假设您现在可能没有获取该内容?

    【讨论】:

    • 我在很多接力示例中都遇到过 ID 字段,但从未见过,它是强制性的(我试试,谢谢瞄准
    • 关于result字段,你说得对,它并没有以完全相同的方式请求,但是result的类型是selector,并且在第一个大查询@987654333中请求了选择器@ 那么对于正确的交集,字段名称是否应该完全相同?因为基于类型,所以可以实际相交
    • 交集是基于id,而不是字段名。这就是为什么您需要确保提供它(并为 fieldID 提供一个有效的现有 id)
    猜你喜欢
    • 2016-10-18
    • 2017-03-17
    • 2016-05-13
    • 2017-07-13
    • 2016-11-13
    • 1970-01-01
    • 2016-07-13
    • 2016-09-12
    • 1970-01-01
    相关资源
    最近更新 更多