是否可以在GraphQL查询中使用嵌套/命名空间的查询变量?

时间:2016-10-10 14:43:19

标签: graphql apollo-server apollostack

我想命名/嵌套查询变量,如下所示:

query ($params: {$id: ID!}) {
  getUser(id: $params.id) {
    email
    username
  }
}

带变量:

{
  "params": {
    "id": "42"
  }
}

但它不是有效的查询。

但是查询如下:

query ($id: ID!) {
  getUser(id: $id) {
    email
    username
  }
}

带变量:

{
  "id": "42"
}

工作得很好。

我想要这样做的原因是自动将query options发送到ApolloReact graphql更高阶组件中,其中params道具从反应路由器应用于包装组件。这个问题基本上与反应路由器无关,除了params道具通过反应路由器应用于组件这一事实。

ApolloReact将尝试使用组件中的props自动构建变量对象,并且由于id嵌套在props中,因此无法找到它。

另一种方法是通过定义接收id的{​​{1}}方法并在options中返回变量对象来明确定义查找ownProps的位置,但我想如果可能,请避免使用它。

1 个答案:

答案 0 :(得分:2)

不,您无法在查询中使用该复合类型的字段。

我认为您最好的选择是创建以下功能:

const options = ({params: variables}) => ({variables})

并导出包装的组件,如下所示:

export default graphql(QUERY, {options})(Component)

这样,react-router传递的params属性将成为传递给查询的变量对象,你可以像这样使用它:

<Component id="1" otherVar="some value"/>

使用常规查询:

query ($id: ID!) {
  getUser(id: $id) {
    email
    username
  }
}