中继突变片段交集

时间:2016-09-13 16:16:19

标签: graphql relayjs relay

我不使用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);

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

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

但是Relay已经提取了修改选择器,并将其传递给带有props的变种。因此,Relay知道应该更改的类型,如何查找项目以及应该替换哪些字段。但不能相交。怎么了?

1 个答案:

答案 0 :(得分:1)

所以,你绝对有点"离开牧场"这里避免使用Relay容器,但我认为这仍然有用......

Relay通过查找FIELDS_CHANGE配置指示的节点来执行查询交集。在这种情况下,您的fieldIDs将其指向标识为result的{​​{1}}节点。

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

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