【问题标题】:Gatsby JS - Multiple pages pulling in markdown files with different categorysGatsby JS - 多个页面拉入不同类别的降价文件
【发布时间】:2018-07-29 07:36:29
【问题描述】:

我正在使用 GatsbyJS 构建个人网页。我有多个页面,两个相关的页面是项目/投资组合页面和博客页面。

我在博客页面上设置了 gatsby,它从特定文件夹中提取降价文件,并使用博客页面上的模板显示它们。我想在项目/投资组合页面上以类似的方式显示我的项目。 我的文件夹结构如下:

-src
 -pages
  -BlogPostOne
  -BlogPostTwo
  projects.js
  blog.js
 -templates
  BlogPostTemplate.js
  ProjectTemplate.js
 -projects
  -project1
  -project2

我希望项目页面从项目文件夹中获取项目降价文件并使用项目模板显示它们

博客页面从 pages 文件夹中抓取博客文章 markdown 文件,并使用博客文章模板显示它们,这工作正常。

我基本上使用相同的代码来获取具有不同变量名和路径的博客文章文件,但它不起作用。甚至可以用盖茨比做到这一点吗?我已经搜索了他们的文档,但找不到与我正在尝试做的类似的事情。有没有人有和盖茨比做类似事情的经验?

【问题讨论】:

    标签: javascript reactjs gatsby


    【解决方案1】:

    是的,这是完全可能的。

    解决方案其实很简单,但是需要稍微了解一下盖茨比的内部原理才能弄清楚。如果您对 Gatsby 有所了解,请参阅 this snippet on GatsbyCentral

    否则,这里有一个更详细的解释。

    在您的gatsby-node.js 文件中,您需要添加以下代码:

    exports.onCreateNode = ({ node, boundActionCreators, getNode }) => {
      const { createNodeField } = boundActionCreators;
    
      if (_.get(node, "internal.type") === `MarkdownRemark`) {
        // Get the parent node
        const parent = getNode(_.get(node, "parent"));
    
        // Create a field on this node for the "collection" of the parent
        // NOTE: This is necessary so we can filter `allMarkdownRemark` by
        // `collection` otherwise there is no way to filter for only markdown
        // documents of type `post`.
        createNodeField({
          node,
          name: "collection",
          value: _.get(parent, "sourceInstanceName")
        });
      }
    };
    

    确保您还拥有 lodash 所需的 require() 语句:

    const _ = require("lodash")
    

    现在确保您在 gatsby-config.js 中有两个插件部分,用于博客文章和项目。确保每个人都有一个name 选项,例如:

    plugins: [
      {
        resolve: "gatsby-source-filesystem",
        options: {
          name: "pages",
          path: `${__dirname}/src/pages`
        }
      },
      {
        resolve: "gatsby-source-filesystem",
        options: {
          name: "projects",
          path: `${__dirname}/src/projects`
        }
      },
    

    然后您可以查询allMarkdownRemark 集合并过滤字段collection。它将是pagesprojects

    示例查询可能如下所示:

    query {
      allMarkdownRemark(filter: {fields: {collection: {eq: "pages"}}}) {
      ...
    

    希望对您有所帮助。

    【讨论】:

    • 太好了,非常感谢!将此标记为其他任何搜索相同内容的人都是正确的。我在任何地方的文档中都找不到这个解决方案。
    • 很高兴您发现它有帮助。这是一个常见的混淆来源。
    • 谢谢你。我有这样很难让这样的东西工作。这是我发现的第一个真正解决它的答案。注意:在 Gatsby v2(在这个答案之后发布)中,您应该将 boundActionCreators 更新为 actions
    • 为什么我们在这里使用lodash而不是直接访问节点对象上的属性? (例如“node.parent”和“parent.sourceInstanceName”?
    • @DavidBerg 如果变量不存在,这是安全访问的首选。这是我的一个普遍习惯,我经常应用太多。有时,如果变量不存在,我们确实希望代码崩溃。
    猜你喜欢
    • 2014-08-16
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多