如何使用Apollo Client按顺序链接两个GraphQL查询

aft*_*lee 14 apollo graphql react-apollo graphcool apollo-client

我正在使用Apollo Client作为前端,使用Graphcool作为后端.有两个查询firstQuerysecondQuery我希望他们在序列页面打开时调用.下面是示例代码(此处未列出TestPage组件的定义):

export default compose(
        graphql(firstQuery, {
            name: 'firstQuery'
        }),
        graphql(secondQuery, { 
            name: 'secondQuery' ,
            options: (ownProps) => ({
                variables: {
                   var1: *getValueFromFirstQuery*
                }
            })
        })
)(withRouter(TestPage))
Run Code Online (Sandbox Code Playgroud)

我需要var1secondQuery从的结果firstQuery.我如何使用Apollo Client和编写?或者还有其他方法吗?提前致谢.

Dan*_*den 37

您的firstQuery组件添加的道具将可用于下面(内部)组件,因此您可以执行以下操作:

export default compose(
  graphql(firstQuery, {
    name: 'firstQuery'
  }),
  graphql(secondQuery, { 
    name: 'secondQuery',
    skip: ({ firstQuery }) => !firstQuery.data,
    options: ({firstQuery}) => ({
      variables: {
          var1: firstQuery.data.someQuery.someValue
      }
    })
  })
)(withRouter(TestPage))
Run Code Online (Sandbox Code Playgroud)

请注意,我们使用skip跳过第二个查询,除非我们实际上有来自第一个查询的数据.

  • 像魅力一样工作!谢谢丹尼尔。奇怪的是,我没有在任何地方找到有关此的文档。 (2认同)

Dam*_*een 5

对于使用react apollo hooks的任何人,相同的方法都有效。

您可以使用两个useQuery钩子并将第一个查询的结果传入skip option第二个,

示例代码:

const AlertToolbar = ({ alertUid }: AlertToolbarProps) => {
  const authenticationToken = useSelectAuthenticationToken()

  const { data: data1 } = useQuery<DataResponse>(query, {
    skip: !authenticationToken,
    variables: {
      alertUid,
    },
    context: makeContext(authenticationToken),
  })

  const { data: data2, error: error2 } = useQuery<DataResponse2>(query2, {
    skip:
      !authenticationToken ||
      !data1 ||
      !data1.alertOverview ||
      !data1.alertOverview.deviceId,
    variables: {
      deviceId:
        data1 && data1.alertOverview ? data1.alertOverview.deviceId : null,
    },
    context: makeContext(authenticationToken),
  })

  if (error2 || !data2 || !data2.deviceById || !data2.deviceById.id) {
    return null
  }
  const { deviceById: device } = data2
  return (
    <Toolbar>
    ...
    // do some stuff here with data12
Run Code Online (Sandbox Code Playgroud)