reactjs - 嵌套 GraphQL 查询以显示 React / GatsbyJS 中的最新博客文章
问题描述
我正在 Gatsby / React 中建立一个具有 2 种内容类型的网站:页面和帖子,并通过 GraphQL(在 Prismic 中)查询我的数据。
我想在页面上包含一个“最近的新闻”模块,显示最新的博文。
我的问题如下:
有没有办法直接在我的模块中访问数据,而不通过每个父 React 组件传递数据?
在这种情况下,我使用的是 Prismic,但我猜同样的情况可能适用于 Contentful、Sanity 或任何其他无头 CMS。
这就是我查询数据的方式:
query pageQuery($uid: String, $lang: String) {
prismic {
allPages(uid: $uid, lang: $lang) {
edges {
node {
title
heading
body {
... on PRISMIC_PageBodyNews {
type
primary {
news_heading
}
}
}
}
}
}
allRecentPosts: allPosts(first: 2) {
edges {
node {
publish_date
title
_meta {
uid
lang
}
}
}
}
}
}
我正在寻找一种方法来实现:
query pageQuery($uid: String, $lang: String) {
prismic {
allPages(uid: $uid, lang: $lang) {
edges {
node {
title
heading
body {
... on PRISMIC_PageBodyNews {
type
primary {
news_heading
}
allRecentPosts: allPosts(first: 2) {
edges {
node {
publish_date
title
_meta {
uid
lang
}
}
}
}
}
}
}
}
}
}
}
现在我收到以下错误:
error Cannot query field "allPosts" on type "PRISMIC_PageBodyNews" graphql/template-string
这是有道理的,因为allPosts
在当前架构中是不允许的。
但是,在我尝试更改我的架构之前,我想知道是否有可能以允许 GraphQL / Prismic 中的“子查询”的方式定义我的架构?
解决方案
您可以添加根query
字段或prismic
字段作为某些对象类型的字段。但我不认为 Prismic 支持这一点。
最好使用片段和/或几个 graphql 查询。根据您的 graphql 客户端和缓存策略,它仍然只能触发到您的服务器的一次往返。
您也可以只使用useContext将数据传递给深层嵌套组件。
如果您确实需要嵌套查询,请查看graphql-compose。它支持回调作为字段类型定义。所以它不应该有类型循环和自引用的问题。
推荐阅读
- asp.net-mvc - 如何在 web api 路由中捕获和接受特定的操作名称?
- excel - 如何应用条件格式来比较评级 vba excel?
- jquery - 如何阻止这个 CSS 手风琴自动向下滚动?
- python - 在数据框的每个索引处输入值
- html - 如何为任何正则表达式创建过滤器
- excel - 有没有办法将数字的值更改为VBA中的文本
- c - WDK 模板不会显示在 Visual Studio 2017 中
- common-lisp - Common Lisp 共享结构混淆
- python - Pandas - 带滑动窗口的条件列
- ios - SpriteKit 场景图像在模拟器上显示为红十字