如何使用react-apollo 使用同一查询进行多个graphql 查询?

2024-01-06

我有一个 graphql 端点:QueryDataForOptions

我想根据组件的多次调用它options支柱。 可能有任意数量的选项。

我想做这样的伪代码,但钩子规则不允许这样做:

const MyComponent = (options) => {
  options.forEach(option => {
    const {data, loading, error} = useQuery(QueryDataForOptions, {variables: {option}})
  })

}

我也考虑过这个伪代码,但我不知道如何处理data被覆盖:

const MyComponent = (options) => {
  const [getOptions, {data, loading, error}] = useLazyQuery(QueryDataForOptions)
  options.forEach(option => {
    getOptions({variables: {option}})
  })
}

我知道正确的解决方案是更改 graphql 端点,但我想在客户端进行此更改。

如何多次调用同一查询?


Apollo 不会公开同时查询多个操作的钩子。但是,GraphQL 支持每个操作查询多个根字段。这一事实与别名字段的能力相结合,意味着您可以在单个请求中获取所有所需的数据。

在编写查询时通常应该远离字符串插值,但在这种情况下我们需要使用它。

const MyComponent = (options) => {
  const query = gql`
  query SomeNameForYourOperation (
    ${options.map((option, index) => `$opt${index}: SomeInputType!`).join('\n')}
  ){
    ${options.map((option, index) => `
      alias${index}: someRootField(someArgument: $opt${index}) {
        ...SomeTypeFragment
      }
    `).join('')}
  }

  fragment SomeTypeFragment on SomeType {
    someField
    someOtherField
  }
  `

  const variables = options.reduce((memo, option, index) => {
    return { ...memo, [`opt${index}`]: option }
  }, {})

  const { data, loading, error } = useQuery(query, { variables })

  if (data) {
    // data.alias0
    // data.alias1
    // etc.
    // You can also iterate through options again here and access the
    // appropriate alias by the index
  }
}

这看起来有点复杂,但实际上非常简单。我们通过迭代生成变量定义options(我们最终得到像这样的变量$opt0, $opt1, ETC。)。然后,我们再次迭代选项以生成根的选择集。对于每个选项,我们将相同的字段添加到查询中,但我们为其别名(如alias0, alias1等),然后将不同的变量传递给该字段的参数。最后,我们利用片段来保持结果查询的大小易于管理。

我们还必须通过一个variables反对useQuery与我们生成的变量定义相匹配,所以我们reduce the options数组转换为具有适当命名属性的对象。

当然,您需要更改上面的示例以包含特定于您的查询的类型、字段和参数。最终结果是您拥有一组data, loading and error变量。查询加载后,您可以使用适当的别名(alias0, etc.).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用react-apollo 使用同一查询进行多个graphql 查询? 的相关文章

随机推荐

  • Android - 完全从 xml 创建列表视图

    我想在我的申请中提出一些选择 现在我正在用一个一个的按钮来做这件事 我真正想做的是将它们呈现为一个列表 就像 设置 应用程序中一样 这归结为创建一个包含预定义值 选择的列表 我的问题是我不知道如何使用 xml 来做到这一点 我可以像这样将
  • ReactJS:如何将一个组件覆盖在另一个组件的元素之上?

    我才刚刚开始反应 我有一个带有输入字段和按钮的组件 还有另一个组件返回 JSX 一个闪烁的点 我正在主组件中导入闪烁点组件 并希望在输入字段为空时将闪烁点覆盖在输入字段的顶部 我怎样才能实现这个目标 请帮助我 其代码可以在以下位置找到 ht
  • For 循环总是至少执行一次吗?

    据我的老师说 即使不满足条件 for 循环也总是至少执行一次 示例 就像我从 C 中知道的那样 for int i 6 i lt 5 i irrelevant for this question 据她说 这个循环至少会执行一次 但它没有执行
  • Android 仅当 RecycleView/List 大于屏幕时才 setStackFromEnd

    我有一个 RecyclerView 我想开始显示底部项目 所以我使用 myLayoutManager setStackFromEnd true 当有足够的项目填满屏幕时 它的工作方式正如我想要的那样 但是如果 RecyclerView 中只
  • Guid 作为 RavenDB 中的 Id

    The RavenDb 文档 http ravendb net docs client api basic operations saving new document状态 支持数字或 Guid Id 属性 并且可以无缝工作 在这种情况下
  • 将我的图像置于 ul li div 中心

    我在页脚中放置了一张图像 我希望它居中 但我不会工作 我希望我的图像居中 所以我希望有人可以帮助我看看我的代码 HTML div class center ul li a href target blank class centering
  • VS2019 Xamarin Forms 远程 IOS 模拟器黑屏 - 如何修复?

    Xamarin 表单项目微软 Visual Studio 2019 版本 16 9 Mac 上的 Xcode 版本 12 4 使用运行14 4的iPad Pro 11英寸作为模拟设备和IOS版本 我尝试过其他模拟器 如果我在 Mac 上构建
  • 为什么我的 Rails 初始化程序在控制台中缓存 ENV 变量(Foreman、Dev env)

    起初的小烦恼现在变成了令人头痛的事情 我正在构建一个 Rails 4 应用程序 并使用 Foreman 进行开发设置 并使用 Procfile 和 env 文件进行配置 当我在 env 文件中设置 ENV 变量时 我的应用程序会正确拾取它
  • 将输出从 terraform 传递到 Azure Devops Pipeline,并在 azure 后端存储中使用状态文件

    我似乎无法检索 Terraform 的公共 IP 地址输出以用于 AzureDevops 中构建管道的下一步 Terraform 状态拉动工作并输出到 json 文件 无法对输出进行 grep Terraform state show op
  • Instagram 如何在故事中嵌入可点击的文本?

    我正在尝试在我的 Android 应用程序中实现类似 Instagram 的故事功能 我可以在图像上制作文本叠加 但如何使它们可点击 如上面的屏幕截图所示 Thanks 尝试使用clickable span with SpannableSt
  • 通过重新压缩 APK 内容来减小其大小

    我有一个相当大的 apk 文件 我正在尝试减小它的大小 已经使用了所有常用技术 例如 Proguard 和图像压缩 尽管如此 该 apk 仍然很大 大约 25mb 维基百科 http en wikipedia org wiki APK fi
  • 使用 libstdc++ 编译库与 clang++ -stdlib=libc++

    我在 Mac OS X 10 8 2 下使用 C 工作 最近需要使用 C 11 功能 这些功能可以通过使用 libc stdlib 的 clang 编译器获得 但是 我还需要使用一些针对 libstdc 来自 MacPorts 编译和链接的
  • SpriteKit 侧向滚动不会更新物理世界

    遵循示例here https stackoverflow com questions 24748247 define map bounds and center on player node 24843989 24843989 除了 Obj
  • 在 React 中定义空 dom 元素的正确方法

    我发送一个可选参数checkbox在组件的 prop 内 var checkBox this props checkbox span span null 然后我这样说 div checkBox div 从上面可以看出 我将 null 分配给
  • Android - 通过彩信发送音频文件

    我使用以下代码通过电子邮件 dropbox 发送音频文件 这并没有让我选择通过彩信发送相同的文件 有人知道如何将其附加到彩信并让用户根据需要发送吗 Intent share new Intent Intent ACTION SEND sha
  • npm rollbackFailed安装任何包时出现可选错误

    我在安装任何一个时遇到问题npm包 这是我的错误 rollbackFailedOptional verb npm session xxxxxxxxxxx 为了解决这个问题 我做了一些事情 但仍然遇到同样的错误 I put registry
  • Resources.getSystem() 与 getResources()

    我是 Android 新手 我正在通过网络上的可用资源自己学习 SDK 我现在遇到一个情况 我正在尝试以下代码 Type 1 getResources getString android R string cancel Type 2 Res
  • 在.NET中实现以数据库为存储介质的日志库

    我刚刚开始开发一个日志库 每个人都可以使用它来在用户运行我们的应用程序时跟踪任何类型的系统信息 到目前为止最简单的示例是跟踪信息 警告和错误 我希望所有插件都能够使用此功能 但由于每个开发人员可能对报告的重要内容有不同的想法 因此我希望尽可
  • 使用蒙特卡罗模拟计算方差的期望值

    所以我有这个概率分布 X 0 概率 7 8 1 60 概率 1 8 詹姆斯他的车一年坏N次 其中N Pois 2 X是修理费用 Y是詹姆斯一年内造成的总费用 我想计算 E Y 和 V Y 这应该给我 E X 15 和 V Y 1800 我有
  • 如何使用react-apollo 使用同一查询进行多个graphql 查询?

    我有一个 graphql 端点 QueryDataForOptions 我想根据组件的多次调用它options支柱 可能有任意数量的选项 我想做这样的伪代码 但钩子规则不允许这样做 const MyComponent options gt