gatsby - 如何将特定上下文注入 Gatsby 中的所有页面?
问题描述
使用gatsby-node.js
andcreatePages
我可以使用 graphql 查询某些内容并使用该内容作为页面上下文创建页面。所以这些页面可以在他们的查询中使用这个东西作为参数。
我面临的问题是我不想使用createPages
. 我对默认创建的页面(来自gatsby-plugin-page-creator
)完全没问题,我只是希望所有这些页面都具有来自graphql的内容作为上下文。
基本上,我希望所有页面都可以使用全局上下文(我从 gatsby graphql 获得)。
有onCreatePage
钩子,但不幸的是,根据https://github.com/gatsbyjs/gatsby/issues/3121#issuecomment-348781341,graphql在那里不可用。
解决方案
这个怎么样......您可以尝试在文件中使用onCreateNode()挂钩gatsby-nodejs
。例如:
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。
推荐阅读
- db2 - 在 DB2 SQL 中,如何终止已经陷入无限循环的递归函数调用......?
- python - 当 C 函数返回动态数组时,Python ctypes 行为异常
- c# - 为什么我无法在 SOAP 标头中添加基本授权?
- spring - Spring Boot:如何从 JPA/Hibernate 注释中保持 DDD 实体的清洁?
- tizen - Tizen 无法创建或查找目录
- python - 为什么 Python 在关键字参数之后允许 *args?
- python - 避免将重复项添加到存储在数据库中的列表的更好方法是什么
- amazon-web-services - 如何为 API Gateway 使用服务到服务和 Cognito 身份验证
- r - 如何将短列表 (#1) 与更大的列表 (#2) 匹配,并使用列表 #2 中的数据获取长度为 #1 的列表
- laravel - vue数据有时不显示!但有时工作!为什么?