我正在回答我自己的问题。如果有人有更好的解决方案,请提交,我很乐意接受。
pages/index.js
我在我的问题中引用并且我认为不是最佳的当前解决方案是在(或您使用的任何地方createPage({path, component, context})
并将数据注入到 中构建顶级可重用组件所需的所有数据context
。这使得它可以通过以下方式提供给component
构造函数属性。这个pathContext
名字,pathContext
让我觉得这是对这个对象精神的滥用,但它完成了工作。
例如,如果您有一个博客,其条目可能有一个标签数组,这可能是您的gatsby-node.js
:
const path = require('path');
const getUniqueTags = edges => {
const set = new Set();
edges.forEach(edge => edge.node.frontmatter.tags.forEach(tag => set.add(tag)));
return [...set];
};
exports.createPages = ({ graphql, boundActionCreators }) => resolve(graphql(`
query AllPagesQuery {
allMarkdownRemark {
edges {
node {
frontmatter {
path
tags
}
}
}
}
}
`)))
.then(({ errors, data }) => {
const { createPage } = boundActionCreators;
const pageTemplate = path.resolve('./src/templates/page.js');
if (errors) return Promise.reject(errors);
return data.allMarkdownRemark.edges.forEach(edge => {
createPage({
path: edge.node.frontmatter.path,
component: pageTemplate,
context: {
path: edge.node.frontmatter.path,
tags: getUniqueTags(data.allMarkdownRemark.edges)
}
});
});
})
.catch(err => console.log(err));
然后你templates/page.js
可以收到这样的唯一标签数组:
const IndexPage = ({ pathContext }) => {
const { tags } = pathContext.map(tag => <li>{ tag }</li>);
return <div>{ tags }</div>;
};
export default IndexPage;