【问题标题】:Are GatsbyJS GraphQL queries tied to the component where it's written?GatsbyJS GraphQL 查询是否与编写它的组件相关联?
【发布时间】:2018-11-30 09:18:06
【问题描述】:

我有几个包含元内容的 yaml 文件,这些文件代表被 Gatsby 的数据源/转换系统摄取的网站页面 - 其中一个文件看起来像这样:

path: /about/
pageTitle: About Us
metaDescription: Learn more about our team and what we do
...

我还有一个包含元内容的基本 yaml 文件,如果元内容丢失或不是专门为该页面编写的,其他页面默认使用该文件。

path: Base
pageTitle: Welcome to our website
metaDescription: We are the leading company of industry x in ...
...

我目前的解决方案是通过 gatsby-node.js 中的 onCreatePage 钩子传递一个 graphql 查询变量 $slug 即页面路径,即 /about/

exports.onCreatePage = ({ page, boundActionCreators }) => {
  const { createPage, deletePage } = boundActionCreators;
  return new Promise(resolve => {
    const oldPage = Object.assign({}, page);
    deletePage(oldPage);
    createPage({
      ...oldPage,
      context: {
        $slug: oldPage.path
      }
    });
    resolve();
  });
};

layout/index.js过滤基础元内容中添加graphql查询,

query BasePageQuery {
  pagesYaml(path: { eq: "Base" }) {
    path
    pageTitle
    metaDescription
    ...
  }
}

还有一个更通用的 graphql 查询在每个页面上,其中字段 path(来自 yaml 文件)与查询变量 $slug 匹配:

query AboutPageQuery($slug: String) {
  pagesYaml(path: { eq: $slug }) {
    path
    pageTitle
    metaDescription
    ...
  }
}

我没有在每个页面上添加一个 graphql 查询,而是将这两个查询都添加到 layout/index.js 中,并且避免必须手动将上述查询添加到所有其他页面。

query BasePageQuery($slug: String) {
  base: pagesYaml(path: { eq: "Base" }) {
    path
    pageTitle
    metaDescription
    ...
  }
  page: pagesYaml(path: { eq: $slug }) {
    path
    pageTitle
    metaDescription
    ...
  }
}

但是,它没有按预期工作 - 布局组件中的 this.props.data 仅返回基本内容并完全忽略我的第二个查询。看起来好像该查询与我的 layout/index.js 组件相关联,并且 $slug 变量没有反映正在呈现的页面组件。

这让我想到了我的问题 -

  1. graphql 查询是否与编写它的组件相关联?在这种特殊情况下 - $slug 是否总是与 path layout/index.js 一样?

  2. 有没有办法打印出 graphql 变量,或者以某种方式验证给定时间点的变量是什么?

  3. 对于我想要实现的目标,有更好的解决方案吗?

【问题讨论】:

    标签: javascript reactjs graphql gatsby


    【解决方案1】:
    1. 我不太明白 GraphQL 查询与何处相关的问题,但我认为当您了解您将 slug 作为变量传递给 createPage 函数时,您会更清楚在您的gatsby-node.js 文件中。因此,对于运行 createPage 时创建的每个页面,slug 变量将是您传递给它的任何内容。

    2. 同样,在gatsby-node.js 文件中的createPage 函数中执行此操作。

    3. gatsby-config.js 将是您想要的“默认”或“基本”信息的更合适位置。查看示例gatsby-starter-bloggatsby-config.js 中有信息,然后与帖子数据一起在 blog-post.js template 中查询。

    【讨论】:

    • 感谢您的回复。为了澄清 1.,盖茨比是否将查询变量传递给布局组件?在弄乱它之后 - 它似乎只会使这些变量出现在页面组件中。
    • 目前和在 Gatsby v1 中,GraphQL 查询只能通过页面/模板组件导出。导出这些内容后,Gatsby 将获取它们并将您的上下文对象应用于它们。使用 Gatsby v2 这将有所不同,您将能够从任何组件编写 GraphQL 查询。
    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 2017-01-31
    • 2020-02-03
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2017-12-23
    相关资源
    最近更新 更多