GraphQL Relay Mutation配置RANGE_ADD的连接的parentName

时间:2016-05-20 09:07:14

标签: graphql relayjs graphql-js

我有一个使用GraphQL中继连接的页面,它提取drafts

query {
    connections {
        drafts(first: 10) {
            edges {
                node {
                    ... on Draft {
                        id
                    }
                }
            }
        }
    }
}

在此页面中,我还通过CreateDraftMutation创建草稿。

mutation {
    createDraft(input: {
        clientMutationId: "1"
        content: "content"
    }) {
        draft {
            id
            content
        }
    }
}

在此突变之后,我希望Relay将创建的草稿添加到其商店中。变异配置的最佳候选者是RANGE_ADD,其记录如下:

https://facebook.github.io/relay/docs/guides-mutations.html

  

RANGE_ADD   给定父级,连接以及响应有效负载中新创建的边缘的名称中继将根据指定的范围行为将节点添加到存储并将其附加到连接。

     

参数

     

parentName:string   响应中的字段名称,表示连接的父级

     

parentID:string   包含连接的父节点的DataID

     

connectionName:string   响应中表示连接的字段名称

     

edgeName:string   响应中的字段名称,表示新创建的边

     

rangeBehaviors:{[call:string]:GraphQLMutatorConstants.RANGE_OPERATIONS}

     

按字母顺序打印的以点分隔的GraphQL调用之间的映射,以及在这些调用的影响下将新边添加到连接时我们希望Relay显示的行为。行为可以是'追加''忽略'' prepend',' reetch'或'删除'

文档中的示例如下:

class IntroduceShipMutation extends Relay.Mutation {
  // This mutation declares a dependency on the faction
  // into which this ship is to be introduced.
  static fragments = {
    faction: () => Relay.QL`fragment on Faction { id }`,
  };
  // Introducing a ship will add it to a faction's fleet, so we
  // specify the faction's ships connection as part of the fat query.
  getFatQuery() {
    return Relay.QL`
      fragment on IntroduceShipPayload {
        faction { ships },
        newShipEdge,
      }
    `;
  }
  getConfigs() {
    return [{
      type: 'RANGE_ADD',
      parentName: 'faction',
      parentID: this.props.faction.id,
      connectionName: 'ships',
      edgeName: 'newShipEdge',
      rangeBehaviors: {
        // When the ships connection is not under the influence
        // of any call, append the ship to the end of the connection
        '': 'append',
        // Prepend the ship, wherever the connection is sorted by age
        'orderby(newest)': 'prepend',
      },
    }];
  }
  /* ... */
}

如果父母和派系一样明显,这是小菜一碟,但如果它直接来自查询连接,我一直很难识别parentName和parentID。

我该怎么做?

编辑:

这是查询的导出方式。

export default new GraphQLObjectType({
  name: 'Query',
  fields: () => ({
    node: nodeField,
    viewer: {
      type: viewerType,
      resolve: () => ({}),
    },
    connections: {
      type: new GraphQLObjectType({
        name: 'Connections',

作为回报用于中继容器

export default Relay.createContainer(MakeRequestPage, {
    fragments: {
        connections: () => Relay.QL`
          fragment on Connections {

1 个答案:

答案 0 :(得分:1)

  

我一直很难识别parentName和parentID   直接来自查询连接。

在您的案例中,来自中继文档的示例中的

factionshipsconnectionsdrafts完全相同。每个GraphQLObject都有一个ID,您的connections对象也是如此。因此,对于您的变异,parentNameconnctionsparentIDconnections的ID。

query {
    connections {
        id
        drafts(first: 10) {
            edges {
                node {
                    ... on Draft {
                        id
                    }
                }
            }
        }
    }
}

顺便说一下,我猜connectionsdrafts是来自您的应用领域的字词。否则,connections会混淆GraphQL连接类型。