27

我在前端使用 Apollo Client,在后端使用 Graphcool。有两个查询firstQuerysecondQuery我希望在页面打开时按顺序调用它们。下面是示例代码(TestPage 组件的定义这里没有列出):

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

我需要var1secondQuery. firstQuery我如何使用 Apollo Client 和 compose 做到这一点?或者有没有其他方法可以做到这一点?提前致谢。

4

2 回答 2

63

您的组件添加的道具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))

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

使用查询组件

如果您正在使用该Query组件,您也可以使用该skip属性,尽管您也可以选择在第一个渲染道具函数中返回其他内容(例如null或加载指示器):

<Query query={firstQuery}>
  {({ data: { someQuery: { someValue } = {} } = {} }) => (
    <Query
      query={secondQuery}
      variables={{var1: someValue}}
      skip={someValue === undefined}
    >
      {({ data: secondQueryData }) => (
        // your component here
      )}
</Query>

使用 useQuery 挂钩

您还可以skipuseQuery钩子一起使用:

const { data: { someQuery: { someValue } = {} } = {} } = useQuery(firstQuery)
const variables = { var1: someValue }
const skip = someValue === undefined
const { data: secondQueryData } = useQuery(secondQuery, { variables, skip })

突变

与查询不同,突变涉及专门调用函数以触发请求。此函数返回一个 Promise,它将使用突变的结果进行解析。这意味着,在处理突变时,您可以简单地将生成的 Promise 链接起来:

const [doA] = useMutation(MUTATION_A)
const [doB] = useMutation(MUTATION_B)

// elsewhere
const { data: { someValue } } = await doA()
const { data: { someResult } } = await doB({ variables: { someValue } })
于 2018-03-16T12:19:28.620 回答
6

对于任何使用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
于 2019-07-02T11:30:48.587 回答