在 reactJS 中使用动态字段的 Apollo 客户端 graphql 查询

Posted

技术标签:

【中文标题】在 reactJS 中使用动态字段的 Apollo 客户端 graphql 查询【英文标题】:Apollo client graphql query with dynamic fields in reactJS 【发布时间】:2020-03-15 19:54:49 【问题描述】:

这是我用于获取用户详细信息的示例 graphql 查询(我在 reactJS 中使用 Apollo 客户端)

如果我只需要 idname 作为响应,我会使用此查询


 getUserDetails 
   id
   name
 

或者如果我只需要 iduserType 我使用这个查询:


 getUserDetails 
   id
   userType
 

有什么方法可以动态传递字段名称和用户类型(基本上是动态传递字段)而不是再次编写整个查询?

【问题讨论】:

但是您可以编写一个在运行时为您构建查询的函数 【参考方案1】:

您可以在运行时构建查询,但通常建议不要这样做(出于我不想进入这里的原因)。相反,GraphQL 提供了其他解决方案:

通常 GraphQL 可以很好地与 React 配合使用,并且以类似的方式进行组合。 GraphQL 带有 fragments 可以帮助组合查询。片段相当于 React 中的组件。 如果你有两个不同的 React 组件,编写两个查询应该没问题。我认为没有理由重用查询。

还有接口/联合。因此,也许您有一个页面要向用户展示,并且取决于您是否与用户是朋友,您想要展示不同的东西:


  getUserDetails 
    id
    name
    ...on UserFriend 
      friendsSince
    
    ...on UserStranger 
      numberCommonFriends
    
  

如果不是这种情况,并且您确实有一个组件具有不同的数据依赖关系,具体取决于某种输入,请不要害怕过度获取。当然 GraphQL 声称可以摆脱过度获取,但您的示例似乎很简单,我不会为此引入复杂性。

好的,你说你的问题只是一个例子!如果您想在设置了某个标志时有条件地加载一些昂贵的字段怎么办。 那么你可以使用directives:


const MyComponentQuery = gql`
  query MyComponentQuery($versionA: Boolean!) 
    
      getUserDetails 
        id
        name @inlude(if: $versionA)
        userType @skip(if: $versionA)
      
    
  
`;

function MyComponent(props) 
  const  data, loading, error  = useQuery(MyComponentQuery, 
    variables:  versionA: props.versionA ,
  );

  return //...


【讨论】:

看起来不错。给定的查询是一个示例,如果有 10-15 个字段,我认为我们不能使用指令。同意吗? 我同意指令是最后的手段,这就是我最后提到它的原因。但我不会动态创建查询。有数百家公司使用 GraphQL,到目前为止,我还没有看到一家公司说他们正在使用动态查询构建。相反,许多人报告了静态查询的好处。恕我直言,如果您 需要 动态查询,您在其他地方做错了什么。在客户端或架构设计中。

以上是关于在 reactJS 中使用动态字段的 Apollo 客户端 graphql 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Apollo graphql 动态调整查询形状(字段)?

Reactjs,Apollo 客户端存储问题

如何在 apollo graphql reactjs 中使用 detalization 查询?

reactjs / jest:无法使用 MockedProvider 用数据填充 react-apollo 组件?

如何使用 apollo Reactjs 客户端刷新 Firebase IdToken

如何将 localStorage 与 apollo-client 和 reactjs 一起使用?