使用不同的模板在gats中创建页面

时间:2019-12-10 15:20:37

标签: javascript graphql gatsby

我是gatsby的新手,正尝试使用不同的模板以编程方式创建页面,但我为此感到困惑。

这是我的gatsby节点文件,可以很好地创建团队成员页面,但是当我想使用位于相同文件夹/ templates的新模板来创建博客帖子时,就会出现问题

const path = require(`path`)
const { createFilePath } = require(`gatsby-source-filesystem`)

exports.onCreateNode = ({ node, getNode, actions }) => {
  const { createNodeField } = actions
  if (node.internal.type === `MarkdownRemark`) {
    const slug = createFilePath({ node, getNode, basePath: `pages` })
    createNodeField({
      node,
      name: `slug`,
      value: slug,
    })
  }
}

exports.createPages = async ({ graphql, actions }) => {
  const { createPage } = actions
  const result = await graphql(`
    query {
      allMarkdownRemark {
        edges {
          node {
            fields {
              slug
            }
          }
        }
      }
    }
  `)

  result.data.allMarkdownRemark.edges.forEach(({ node }) => {
    createPage({
      path: node.fields.slug,
      component: path.resolve(`./src/templates/member-info.js`),
      context: {
        slug: node.fields.slug,
      },
    })
  })
}

我尝试了不同的方法,但无法找到解决方案。 谢谢!

1 个答案:

答案 0 :(得分:0)

大多数幼稚的方法是使用其他模板组件来调用createPage。也许更健壮的方法是在frontmatter中定义模板名称,并使用它来动态构建各个组件的路径,例如:

some markdown file

---
template: member-info
---

gatsby-node.js

exports.createPages = async ({ graphql, actions }) => {
  const { createPage } = actions
  const result = await graphql(`
    query {
      allMarkdownRemark {
        edges {
          node {
            frontmatter {
              template
            }
            fields {
              slug
            }
          }
        }
      }
    }
  `)

  result.data.allMarkdownRemark.edges.forEach(({ node }) => {
    createPage({
      path: node.fields.slug,
      component: path.resolve(`./src/templates/${template}.js`),
      context: {
        slug: node.fields.slug,
      },
    })
  })
}