Apollo客户端graphql查询与reactJS中的动态字段

anu*_*33p 2 reactjs graphql graphql-js react-apollo apollo-client

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

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

{
 getUserDetails {
   id
   name
 }
}
Run Code Online (Sandbox Code Playgroud)

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

{
 getUserDetails {
   id
   userType
 }
}
Run Code Online (Sandbox Code Playgroud)

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

Her*_*rku 6

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

一般来说,GraphQL 与 React 配合得很好,并且以类似的方式组合。GraphQL 附带可以帮助编写查询的片段。片段相当于 React 中的组件。如果您有两个不同的 React 组件,那么编写两个查询应该没问题。我认为没有理由重用查询。

然后是接口/联合。因此,也许您有一个页面想要向用户显示,并且根据您是否是该用户的朋友,您想要显示不同的内容:

{
  getUserDetails {
    id
    name
    ...on UserFriend {
      friendsSince
    }
    ...on UserStranger {
      numberCommonFriends
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果情况并非如此,并且您确实有一个组件具有不同的数据依赖关系,具体取决于某种输入,请不要担心过度获取。当然 GraphQL 声称可以摆脱过度获取,但你的例子看起来太微不足道了,我不会为此引入复杂性。

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

{
  getUserDetails {
    id
    name
    ...on UserFriend {
      friendsSince
    }
    ...on UserStranger {
      numberCommonFriends
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我同意指令是最后的手段,这就是我最后提到的原因。但我不会动态创建查询。有数百家公司在使用 GraphQL,但到目前为止,我还没有看到一家公司表示他们正在使用动态查询构建。相反,许多人报告了静态查询的好处。恕我直言,如果您_需要_动态查询,那么您在其他地方做错了。无论是在客户端还是在架构设计中。 (2认同)