javascript - GatsbyJS GraphQL 查询是否与编写它的组件相关联?
问题描述
我有几个带有元内容的 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 ...
...
我目前的解决方案是传递一个graphql查询变量$slug
,它是页面路径,即/about/
通过onCreatePage
钩子 in gatsby-node.js
,
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
...
}
}
以及在字段(来自 yaml 文件)与查询变量匹配的每个页面上的更通用的 graphql 查询:path
$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 变量没有反映正在呈现的页面组件。
这让我想到了我的问题-
graphql 查询是否与编写它的组件相关联?在这种特殊情况下 -
$slug
总是会是什么path
layout/index.js
?有没有办法打印出 graphql 变量,或者以某种方式验证给定时间点的变量是什么?
对于我想要实现的目标,是否有更好的解决方案?
解决方案
我不太明白 GraphQL 查询与何处相关的问题,但我认为当您了解您
slug
作为变量传递给文件中的createPage
函数时,您会更清楚gatsby-node.js
。因此,对于运行时创建的每个页面,createPage
变量slug
将是您传递给它的任何内容。同样,在您的
gatsby-node.js
文件中,在createPage
函数中执行此操作。gatsby-config.js
将是您想要的“默认”或“基本”信息的更合适的位置。查看示例gatsby-starter-blog
。模板中的信息与帖子的数据一起gatsby-config.js
被查询。blog-post.js
推荐阅读
- sap - 如何将 SUBSELECT 与 JOIN 一起使用?
- css - 移动网站版本被缩放和裁剪
- swift - Swift 中的 Coinbase 身份验证签名
- java - 调试时Eclipse中的“找不到源”错误
- swift - 如何知道 fetchProviders() 何时完成执行?
- ruby-on-rails - 如何在 Heroku 中查看详细的 Rails 日志?
- regex - 仅调整具有特定图案的图像大小
- reactjs - React Native - 注销后登录屏幕加载两次
- javascript - 将键从另一个对象合并到嵌套对象中
- salesforce - Lightning - 选项列表标签的千位逗号分隔符