3 回答
TA贡献1828条经验 获得超13个赞
查看有关StaticQuery 与页面查询有何不同的文档
StaticQuery 可以做页面查询可以做的大部分事情,包括片段。主要区别是:
页面查询可以接受变量(通过 pageContext)但只能添加到页面组件
StaticQuery 不接受变量(因此得名“静态”),但可以在任何组件中使用,包括页面
StaticQuery 不适用于原始 React.createElement 调用;请使用 JSX,例如
<StaticQuery />
TA贡献1842条经验 获得超21个赞
您不能在静态查询中进行字符串插值或类似操作。原因是在构建时需要知道静态查询。那就是执行的时候。它在您构建网站时运行,而不是在网站上线时运行。这不仅是 StaticQuery 的静态部分,也是一般 Gatsby 的静态部分。PageQueries 中可能没有“静态”,但它们也运行构建时间。唯一的区别是它们确实允许使用参数,无论是以与您在此处尝试使用的方式不同的方式。
如果这是在使用createPagesAPI自动生成的页面上,您应该将一些标识符向下传递给页面,然后它可以在 PageQuery 中使用它来获取数据。据我所知,这看起来不像是您的页面元素。这是您在博客文章的底部显示有关作者的一些详细信息吗?看起来您的作者和博客页面都有一个单独的实体。那挺好的。实现这一点的一种方法是确保在 PageQuery 中查询所有必要信息。如果您的页面组件中有数据,您可以简单地将其传递给其子组件。您只需要使用上下文获取 PageComponent 的所有必要标识符。这是 Gatsby 文档中的显示方式:
exports.createPages = ({ graphql, actions }) => {
const { createPage } = actions
const blogPostTemplate = path.resolve(`src/templates/blog-post.js`)
return graphql(`
query loadPagesQuery ($limit: Int!) {
allMarkdownRemark(limit: $limit) {
edges {
node {
frontmatter {
slug
}
}
}
}
}
`, { limit: 1000 }).then(result => {
if (result.errors) {
throw result.errors
}
result.data.allMarkdownRemark.edges.forEach(edge => {
createPage({
path: `${edge.node.frontmatter.slug}`,
component: blogPostTemplate,
context: {
// You need the something to query the author by, and something to query
// the blog post by.
author: edge.node.frontmatter.authorId, // or whatever you use to identify authors
slug: edge.node.frontmatter.slug
},
})
})
})
}
注意在上下文对象内部传递的两个变量。现在在您的页面元素中,您有这两个可以传递给查询的变量。$autoId 变量和 $slug 变量。在博客页面上,您将需要博客文章内容,但我相信您已经处理了这部分内容,以及用于显示作者信息的作者详细信息。在 PageQuery 中,您可以简单地请求两个实体。一个用于博文,另一个用于作者。
TA贡献2041条经验 获得超4个赞
我有限的 GraphQL 知识没有成功,在这个阶段我不想深入研究它 - 我只有一个 GraphQL 用例。
所以我更深入地研究了文档,发现了这个:https : //www.gatsbyjs.org/docs/gatsby-config/#mapping-node-types,它运行良好,实施起来非常简单,专为精确我需要它的原因(博客作者生物信息)。
我很遗憾没有更早地发现这一点并防止出现不必要的问题,但我希望这对将来的人有所帮助。
再次感谢。
添加回答
举报