无法使用 Apollo 客户端以编程方式获取数据

Posted

技术标签:

【中文标题】无法使用 Apollo 客户端以编程方式获取数据【英文标题】:Can't Programatically fetch data with Apollo Client 【发布时间】:2019-09-16 04:51:21 【问题描述】:

关于 Apollo Client 和 GraphQL 查询的大部分信息都是关于获取数据并立即渲染的。

对于我想要获取数据以更新状态的常见用例,我显然不需要呈现 JSX,我只想运行 javascript 代码。

以如下代码sn-p为例

onRefChange (formValues) 

    let  project, ref  = formValues
    let projectFound = find(this.state.projects, (o) =>  return o.id === project.value  )

    let variables = 
      slug: projectFound.slug, ref: parseInt(ref)
    
    console.info('variables ready', variables)
    return (
      <Query query=RESOLVE_REF variables=variables>
         ( data, error ) => 
          console.info('data response', data)
          console.info('error response', error)
          return data
        
      </Query>
    )
  

Apollo 强迫我使用 Query 组件来执行查询,即使我不想渲染任何东西。那些console.info 也从不记录任何东西,但变量就绪文本确实出现了。

我发现文档对使用Query 组件非常清楚,但对每个不同的选项都模糊不清。我觉得我错过了什么。

我还担心 Apollo 似乎不尊重职责分离,显然将数据和表示合并为单一职责(Query 组件很清楚),在我目前的理解中是相当的很傻,但很可能是我搞砸了。

感谢任何见解。

【问题讨论】:

【参考方案1】:

只要您在组件树的顶部配置并包含ApolloProvider,就可以使用withApollo HOC 或ApolloConsumer 获取查询实例:

const MyComponent = ( client ) => 
 // use it!

withApollo(MyComponent)

<ApolloConsumer>
  client => (
    // use it!
  )
</ApolloConsumer>

然后,您可以使用客户端实例可用的任何方法,包括 querymutation,这两个方法都返回解析为 ApolloQueryResult 对象的 Promise,其中包括 data 和 @987654330 @。可以在here 找到客户端 API 的完整文档。您的代码将如下所示:

async onRefChange (formValues) 
  let  project, ref  = formValues
  let projectFound = find(this.state.projects, (o) =>  return o.id === project.value  )

  let variables = 
    slug: projectFound.slug, ref: parseInt(ref)
  
  try 
    const  data  = await this.props.client(RESOLVE_REF,  variables )
   catch (e) 
    // Handle errors
  

【讨论】:

最终选择了 ApolloConsumer 方式。感谢您的澄清。

以上是关于无法使用 Apollo 客户端以编程方式获取数据的主要内容,如果未能解决你的问题,请参考以下文章

Apollo Client V2 以错误的顺序获取数据

无法在单个 GraphQL 查询中组合本地和远程数据(Next.js + Apollo)

以编程方式了解 ftp 客户端是不是会使用 RDW 从 zOS 获取数据集

如何在 apollo 客户端中获取值

使用客户端对象模型 SharePoint 2010 以编程方式获取 ListItemVersion

使用 Apollo 链路状态缓存实现客户端过滤