getOptimisticResponse不适用于带参数的字段

时间:2016-07-22 09:58:48

标签: graphql relayjs relay

以下是我在群组中添加和删除某人的代码。

出于某种原因,getOptimisticResponse不适用于此突变。

这可能是因为groupId字段的参数isInGroup吗?

class GroupAddRemovePersonMutation extends Relay.Mutation {
  static initialVariables = {
    groupId: null,
  }

  static prepareVariables(prevVars) {
    return prevVars;
  }

  static fragments = {
    person: () => Relay.QL`
      fragment on Person {
        id
        isInGroup(groupId: $groupId)
      }
    `,
  }

  getMutation() {
    return this.props.isInGroup ?
      Relay.QL`mutation { groupRemovePerson }` :
      Relay.QL`mutation { groupAddPerson }`;
  }

  getVariables() {
    const {groupId, person} = this.props;
    return {
      personId: person.id,
      groupId,
    };
  }

  getCollisionKey() {
    const {groupId, person} = this.props;
    return `groupPerson_${groupId}_${person.id}`;
  }

  getFatQuery() {
    const {groupId, person, isInGroup} = this.props;
    return isInGroup ?
      Relay.QL`
        fragment on GroupRemovePersonMutationPayload {
          person {
            id
            groups { id }
            isInGroup(groupId: "${groupId}")
          }
          group {
            id
            person
            hasPerson(personId: "${person.id}")
          }
        }
      ` :
      Relay.QL`
        fragment on GroupAddPersonMutationPayload {
          person {
            id
            groups { id }
            isInGroup(groupId: "${groupId}")
          }
          group {
            id
            person
            hasPerson(personId: "${person.id}")
          }
        }
      `;
  }

  getConfigs() {
    const {groupId, person} = this.props;
    return [{
      type: 'FIELDS_CHANGE',
      fieldIDs: {
        person: person.id,
        group: groupId,
      },
    }];
  }

  getOptimisticResponse() {
    const {groupId, person, isInGroup} = this.props;
    return {
      person: {
        id: person.id,
        isInGroup: !isInGroup,
      },
      group: {
        id: groupId,
        hasPerson: !isInGroup,
      },
    };
  }
}

1 个答案:

答案 0 :(得分:0)

我会首先尝试将groupId添加到乐观响应中。根据我的经验,乐观的响应必须与胖查询的形状完全匹配。

如果在生成乐观响应时没有groupId,则可以尝试替换临时值,直到从服务器返回响应。当您渲染连接并向视图提供键以区分重复的React元素时,通常会出现这种情况。