在 React 中使用 GraphQL 查询数据以及来自先前查询的数据

Posted

技术标签:

【中文标题】在 React 中使用 GraphQL 查询数据以及来自先前查询的数据【英文标题】:Query data with GraphQL in React with data from a previous query 【发布时间】:2018-02-16 08:54:57 【问题描述】:

所以通常我对使用 apollo react 和 GraphQL 查询或变异数据没有任何问题。但有一件事我只是不明白:假设我有一个查询得到一个任意实体的 Id,如下所示:

const Query = graphql(
  baseNodeQuery([
    'entityId',
    'entityLabel'
  ], 'employment_reference_preset'), 
    options: 
      variables: 
        filter: 
          type: "employment_reference_preset"
        ,
        limit: 1000,
        offset: 0
      
    
  )
(ExampleComponent);

baseNodeQuery 是一个自定义函数,它接受一些参数来使用 gql() 准备查询。但无论如何,在我的 ExampleComponent 中,我可以使用这样的数据:

const EmploymentReferencePresetEntity = (data: loading, error, nodeQuery) => 
  if (loading) 
    return <p>Loading...</p>;
  
  if (error) 
    return <p>error.message</p>;
  

  return (
    <div>
      //do something with the data form nodeQuery
    </div>
  )
;

但是,当我想使用从上一个查询中获得的 Id 进行第二次查询并将该 Id 用作过滤器时呢?当我像以前一样在我的 ExampleComponent 中返回另一个 graphql 查询时,我收到一个错误,即我没有返回有效的反应组件。那我该怎么做呢?

提前致谢!

【问题讨论】:

【参考方案1】:

过去我能够做到这一点的方法是将“子”查询分离到它自己的组件中。

假设您有一个向您展示所有行星的太阳系组件。所以你有一个查询来返回没有细节的行星,另一个查询叫做 planetDetails 或其他东西。你创建你的 SolarSystem 组件并用你的父查询包装它,然后其中的每个行星将加载另一个组件并将planetID 作为道具传递给它。在该组件上,您包装了 planetDetails 查询并为您的查询获取道具“planetID”。

我知道这不是最好的例子,希望它有所帮助。

【讨论】:

【参考方案2】:

在您 return JSX 之前,在您的 EmploymentReferencePresetEntity 中进行并解决第二次调用可能有助于您的目的。像这样:

const EmploymentReferencePresetEntity = (data: loading, error, nodeQuery) => 
  if (loading) 
    return <p>Loading...</p>;
  
  if (error) 
    return <p>error.message</p>;
  

  ... make and resolve your second query here like...
  const secondQueryResult = await secondQuery(nodeQuery)

  return (
    <div>
      //do something with secondQueryResult
    </div>
  )
;

【讨论】:

以上是关于在 React 中使用 GraphQL 查询数据以及来自先前查询的数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 typescript、react 和 graphql 以正确方式进行查询的问题

使用 React 的 GraphQL 查询到数组列表?

在 React、Redux-Form 和 GraphQL 中选择输入中的 onChange 事件从数据库中查询

如何在 React + Apollo GraphQL 中查询先前查询的结果?

如何在 react-apollo graphql 查询中正确使用动态变量?

如何在 react/js 中映射别名 graphql 查询?