如何在Gatsby的所有页面中注入特定上下文?

时间:2018-11-16 08:30:48

标签: gatsby

使用gatsby-node.jscreatePages,我可以使用graphql查询某物,并使用该某物作为页面上下文来创建页面。因此,这些页面可以在查询中使用 something 作为参数。

我面临的问题是我不想使用createPages。我对默认创建的页面(来自gatsby-plugin-page-creator)完全满意,我只希望所有页面都具有来自graphql的某物作为上下文。

基本上,我希望所有页面都可以使用全局上下文(从gatsby graphql获得)。

onCreatePage钩子,但不幸的是,根据https://github.com/gatsbyjs/gatsby/issues/3121#issuecomment-348781341,graphql不可用。

1 个答案:

答案 0 :(得分:1)

这是什么...您可以尝试在您的gatsby-nodejs文件中使用 onCreateNode()挂钩。例如:

const allMyPageNodes = [];

exports.onCreateNode = ({ node, actions, getNode }) => {
  const { createNodeField } = actions;
  if(...) { //whatever filtering you need to select JUST pages in your site
    const mySpecialContext = "blah"; //whatever your global context settings are
    createNodeField({ node, name: "myglobal", value: mySpecialContext });
    allMyPageNodes.push(node);
  }
}

```

然后在随后的所有graphql查询中,对于页面,graphql有效负载应填充 edge.node.fields.myglobal ,并且您应该可以使用它进行任何操作。还可以查看https://www.gatsbyjs.org/docs/static-query/,以便直接从组件内部进行查询。

HTH。