1

出于某种原因,如果我生成一个根查询,它在注入子组件之前接受参数,如下所示:

import Relay from 'react-relay';

export default {
  production: (Component) => Relay.QL`
    query {
      getProduction(id: $productionId) {
        ${Component.getFragment('production')}
      }
    }
  `
};

Relay 最初生成这个查询:

query MyProductionDetailsQuery($id_0:ID!,$where_1:ProductionRoleWhereArgs!) {
  getProduction(id:$id_0) {
    id,
    ...F0
  }
}
fragment F0 on Production {
  id,
  ...
  _roles4oPiwv:roles(first:10,where:$where_1) {
    edges {
      node {
        id,
        ...
      },
      cursor
    },
    pageInfo {
      hasNextPage,
      hasPreviousPage
    }
  }
}

变量:

{id_0: "UHJvZHVjdGlvbjoxNg==", where_1: {archived: {eq: true}}}

但是,如果组件的中继容器有自己的变量,运行this.props.relay.setVariables({...variables})会完全将中继生成的请求查询变成这样:

query My_production_details_page_ProductionRelayQL($id_0:ID!,$where_1:ProductionRoleWhereArgs!) {
  node(id:$id_0) {
    ...F0
  }
}
fragment F0 on Production {
  id,
  _roles6J5gK:roles(first:10,where:$where_1) {
    edges {
      node {
        id,
        ...
      },
      cursor
    },
    pageInfo {
      hasNextPage,
      hasPreviousPage
    }
  }
}

变量:

{id_0: "UHJvZHVjdGlvbjoxNg==", where_1: {archived: {eq: false}}}

但是,如果我有一个没有参数的根查询,setVariables 可以正常工作:

import Relay from 'react-relay';

export default {
  viewer: (Component, variables) => Relay.QL`
    query {
      viewer {
        ${Component.getFragment('viewer', { ...variables })}
      }
    }
  `
};

这是生成的查询:

query ViewerQuery($where_0:ProductionWhereArgs!) {
  viewer {
    ...F0
  }
}
fragment F0 on Viewer {
  user {
    _productions2IPZAw:productions(first:10,where:$where_0) {
      edges {
        node {
          id,
          ...
        },
        cursor
      },
      pageInfo {
        hasNextPage,
        hasPreviousPage
      }
    },
    id
  }
}

变量:

{where_0: {expDate: {gt: "2016-11-04T16:29:11.677Z"}, archived: {eq: false}}}

在工作设置中的 setVariables 之后:

query ViewerQuery($where_0:ProductionWhereArgs!) {
  viewer {
    ...F0
  }
}
fragment F0 on Viewer {
  user {
    _productions1CyNvL:productions(first:10,where:$where_0) {
      edges {
        node {
          id,
          ...
        },
        cursor
      },
      pageInfo {
        hasNextPage,
        hasPreviousPage
      }
    },
    id
  }
}

变量:

{where_0: {expDate: {lt: "2016-11-04T16:34:12.537Z"}, archived: {eq: false}}}

版本:

"react-relay": "^0.9.3",
"react-router-relay": "^0.13.5"

我不确定我的配置是否有问题,或者这只是 Relay 端的错误。

有谁知道可能导致此问题的原因?

4

1 回答 1

0

当您运行 setVariables 时,它会导致仅重新获取必要的数据。Relay 查看查询的哪一部分可能会受到更改变量的影响,并且来自 GraphQL 服务器的请求需要片段。这是可能的,因为 Node 接口(即通过不透明的 Relay id 获取对象)。在文档中查看更多信息。

我认为,在您的情况下,您应该在 GraphQL 服务器上实现生产类型的节点接口。

于 2016-11-04T00:28:14.323 回答