当然,这是可行的,但请记住,您需要向代码提供该信息(选择的布局)。如果您使用文件系统路由 API 遵循本教程,则需要使用 gatsby-node.js 切换到创建动态页面的“经典”版本,因为需要在某处提供这种逻辑以让 Gatsby 意识到那个。
您可以添加一个名为 layout 的 Contentful 字段,在这种情况下可以是整数或类似的东西,然后在您的 gatsby-node.js 中:
const path = require("path")
exports.createPages = async ({ graphql, actions, reporter }) => {
const { createPage } = actions
const result = await graphql(
`
{
allContentfulBlogPost {
edges {
node {
layout
slug
}
}
}
}
`
)
if (result.errors) {
reporter.panicOnBuild(`Error while running GraphQL query.`)
return
}
const blogPostTemplate1 = path.resolve(`src/templates/blog-post-1.js`)
const blogPostTemplate2 = path.resolve(`src/templates/blog-post-2.js`)
const posts = result.data.allContentfulBlogPost.edges
posts.forEach((post, index) => {
createPage({
path: `/blog/${post.node.slug}/`,
component: post.node.layout === "1" ? blogPostTemplate1 : blogPostTemplate2,
context: {
slug: post.node.slug
},
})
})
})
}
文件系统路由 API 使您免于在 gatsby-node.js 中为标准方法添加这种查询 + 逻辑,但由于它不支持过滤(尚)您需要添加一些您需要的逻辑回到“标准”方法。
基本上,您正在获取 Contentful 数据,查询 slug 和 layout(新字段),并根据该条件创建动态页面。
请注意,在component 中,您是根据使用三元条件的布局字段选择一个或另一个模板。当然,根据需要调整它。理想情况下,在复杂的方法(超过 2 个布局)中,它应该是一个可读性的函数。
您的遗留代码的其余部分(您的模板查询)将单独工作,因为您使用以下上下文提供 slug(就像您之前所做的那样):
context: {
slug: post.node.slug
},