【问题标题】:Nested GraphQL query to show latests blog posts in React / GatsbyJS嵌套 GraphQL 查询以显示 React / GatsbyJS 中的最新博客文章
【发布时间】:2020-11-20 23:40:29
【问题描述】:

我正在 Gatsby / React 中构建一个具有 2 种内容类型的网站:Pagesposts,并通过 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 中的“子查询”的方式定义我的架构?

【问题讨论】:

    标签: reactjs graphql headless prismic.io


    【解决方案1】:

    您可以添加根query 字段或prismic 字段作为某些对象类型的字段。但我不认为 Prismic 支持这一点。

    最好使用片段和/或几个 graphql 查询。根据您的 graphql 客户端和缓存策略,它仍然只能触发到您的服务器的一次往返。

    您也可以只使用useContext 将数据传递给深层嵌套组件。

    如果您确实需要嵌套查询,请查看graphql-compose。它支持回调作为字段类型定义。所以它不应该有类型循环和自引用的问题。

    【讨论】:

    • 感谢您的回答。 useContext 可能是要走的路。只是想确保没有一些简单的方法可以嵌套它。让嵌套查询工作可能比仅仅使用 useContext 需要更长的时间
    猜你喜欢
    • 2020-07-30
    • 2020-05-09
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    相关资源
    最近更新 更多