如何将两个依赖的 GraphQL 查询与 'compose' 结合起来?

How to combine two dependent GraphQL queries with 'compose'?

已解决!

我正在尝试合并两个相关的 GraphQL 查询。

第一个应该得到一个 ID,第二个应该得到那个 ID。我读到 compose 的行为类似于 flowRight(),但无论我以什么顺序放置查询,如果 queryId 低于 queryDetails,queryDetail 总是被跳过(如预期的那样)。无论我如何将代码放在一起,变量都是未定义的。

import { graphql, compose } from 'react-apollo'
import gql from 'graphql-tag'

class Home extends Component {
  constructor(props) {
    super(props)
    console.log("Where's my data?")
    console.log(props)
  }

  render() {
    return(
      <div />
    )
  }
}

export const queryIdConst = gql`
  query IdQuery {
    account(name:"SuperAccount") 
    {
      lists {
        edges {
          id
        }
      }
    } 
  }
`

export const queryDataConst = gql`
  query DataQuery($id: ID!) {
    account(name:"SuperAccount") 
    {
      list(id: $id) {
        displayTitle
      }
    } 
  }
`

export default compose(
  graphql(queryIdConst, {
    name: 'listId',
  }),
  graphql(queryDataConst, { 
    name: 'data',
    skip: ({ listId }) => !listId.data,
    options: ({ listId }) => ({
      variables: {
        id: list.data.account.lists.edges[0].id
      }
    })
  })
)(Home)

我已经尝试更改撰写函数的顺序,但无论如何这都行不通,正如我预期的那样。

感谢您的帮助!

编辑:将 compose() 中的两个 graphql() 切换为内联 AbsoluteSith's comment

解决方案

Daniel Rearden and AbsoluteSith 的提示和帮助下,我实施了以下解决方案:

更改了 compose():

export default compose(
  graphql(queryIdConst, {
    name: 'listId',
  }),
  graphql(queryDataConst, { 
    name: 'dataHome', // changed to 'dataHome' to avoid confusion
    skip: ({ listId }) => !listId.account,
    options: ({ listId }) => ({
      variables: {
        id: listId.account.lists.edges[0].id
      }
    })
  })
)(Home)

我的渲染器():

return(
  <div>
    { dataHome && !dataHome.loading && 
      <div>{dataHome.account.list.displayTitle}</div> 
    }
  </div>
)

当使用 graphql HOC 时,默认情况下,包装组件会收到一个名为 data 的 prop(如果传入突变,则为 mutate)。给定一个查询

query IdQuery {
  account(name:"SuperAccount") {
    lists {
      edges {
        id
      }
    }
  } 
}

查询加载后,查询结果在 this.props.data.account 下可用。当您使用 name 配置选项时,您是在告诉 HOC 使用 data 以外的名称作为 prop 名称。因此,如果您将名称设置为 listId,那么您的查询结果将在

处可用
this.props.listId.account

这意味着 compose 中的第二个 HOC 应该看起来更像这样:

graphql(queryDataConst, { 
  skip: ({ listId }) => !listId.account, // <--
  options: ({ listId }) => ({
    variables: {
      id: listId.account.lists.edges[0].id // <--
    }
  })
})