【发布时间】: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 变量没有反映正在呈现的页面组件。
这让我想到了我的问题 -
graphql 查询是否与编写它的组件相关联?在这种特殊情况下 -
$slug是否总是与pathlayout/index.js一样?有没有办法打印出 graphql 变量,或者以某种方式验证给定时间点的变量是什么?
对于我想要实现的目标,有更好的解决方案吗?
【问题讨论】:
标签: javascript reactjs graphql gatsby