私は自分自身の質問に答えています。誰かがより良い解決策を持っているなら、それを提出してください。私はそれを喜んで受け入れます。
私は私の質問の中で参照し、私は次善のだと思う私の現在のソリューションは、pages/index.js
でトップレベルの再利用可能なコンポーネントに必要なすべてのデータを構築することである(またはどこでもcreatePage({path, component, context})
を使用してcontext
にデータを注入します。このpathContext
プロパティ経由component
コンストラクタで使用できるようになります。名前、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
は、このようなユニークなタグ配列受け取ることができます:あなたはあなたのレイアウト/ index.js
export const avatarsFragmentQuery = graphql`
fragment avatars on RootQueryType {
avatars: allImageSharp {
edges {
node {
id
}
}
}
}
`
にフラグメントのクエリを作成し、あなたのページでそれを使用することができます
const IndexPage = ({ pathContext }) => {
const { tags } = pathContext.map(tag => <li>{ tag }</li>);
return <div>{ tags }</div>;
};
export default IndexPage;
クイック答えはhttps://github.com/gatsbyjs/gatsby/search?utf8=%E2%9C%93&q=fragment&type=うまくいけば、I'LLヘクタールの断片であります間もなくこれについて書類を書く時間を割いてください。 –
ありがとう@KyleMathews(そしてギャツビーのために多くの感謝)。私が終わったら、私は調査し、更新します。 – Andrew
@KyleMathews - まだ見ていない。フラグメント(クエリ内)は、それらが展開する単一のグラフエッジのみを受け取るようです。 'allMarkdownRemark'のようにアクセスできる例はありません。アバターの例では、1つの投稿ページにすべてのサイト作成者のすべてのアバターのリストをどのように表示しますか?あるいは、 'gatsby-node.js'でリストを作成できたら、それをどのページに渡すべきですか? – Andrew