首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建一个单独的Gatsby页面,以显示和过滤所有博客文章的标签/类别

如何创建一个单独的Gatsby页面,以显示和过滤所有博客文章的标签/类别
EN

Stack Overflow用户
提问于 2021-02-16 08:38:30
回答 1查看 1.1K关注 0票数 2

你好,我正在构建一个博客使用盖茨比和Netlify CMS。我从盖茨比初学者-netlify-cms模板开始。

我有一个/blog页面,在该页面中,我显示了所有的帖子以及所有标签的列表。当用户单击标记时,它当前被重定向到tags/name-of-tag页面,在该页面中会显示一个标记为这样的所有帖子的列表。

我想要的是直接过滤/blog页面上的列表。这样,我将只有一个页面来显示和过滤博客文章的标签(并可能通过术语搜索)。

因此标记链接应该重定向到/blog?tag-name或类似的东西。我不知道如何告诉盖茨比创建一个有可能注入filter值的页面,以便将其传递给页面查询。

以下是当前创建/tags/页面的方式:

代码语言:javascript
复制
// Tag pages:
    let tags = []
    // Iterate through each post, putting all found tags into `tags`
    posts.forEach((edge) => {
      if (_.get(edge, `node.frontmatter.tags`)) {
        tags = tags.concat(edge.node.frontmatter.tags)
      }
    })
    // Eliminate duplicate tags
    tags = _.uniq(tags)

    // Make tag pages
    tags.forEach((tag) => {
      const tagPath = `/tags/${_.kebabCase(tag)}/`

      createPage({
        path: tagPath,
        component: path.resolve(`src/templates/tags.js`),
        context: {
          tag,
        },
      })
    })

这是我的博客页面查询(我希望能够通过标记进行筛选):

代码语言:javascript
复制
export const blogPageQuery = graphql`
  query BlogPageTemplate {
    markdownRemark(frontmatter: { templateKey: { eq: "blog-page" } }) {
      frontmatter {
        image {
          childImageSharp {
            fluid(maxWidth: 2048, quality: 80) {
              ...GatsbyImageSharpFluid
            }
          }
        }
        heading
        subheading
      }
    }
    allMarkdownRemark(
      sort: { order: DESC, fields: [frontmatter___date] }
      filter: { frontmatter: { templateKey: { eq: "blog-post" } } }
    ) {
      edges {
        node {
          id
          fields {
            slug
          }
          excerpt(pruneLength: 180)
          frontmatter {
            date(formatString: "MMMM DD, YYYY")
            title
            description
            featuredpost
            featuredimage {
              childImageSharp {
                fluid(quality: 50, maxWidth: 512) {
                  ...GatsbyImageSharpFluid
                }
              }
            }
          }
        }
      }
    }
  }
`
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-16 09:16:17

我不知道如何告诉Gatsby创建一个有可能注入filter值的页面,以便将其传递给页面查询。

不能。在页面查询中筛选数据的唯一方法是使用上下文传递数据。就像您正在使用标记页面所做的那样:

代码语言:javascript
复制
  createPage({
    path: tagPath,
    component: path.resolve(`src/templates/tags.js`),
    context: {
      tag,
    },
  })

最简单和本机的方法是使用/tag/tag-name页面,它的目的是通过标记名进行筛选,否则,您将需要获取JavaScript filter函数中的URL参数并使用它来过滤页面查询中的所有数据。因为你错过了博客页面的渲染部分.像这样的方法应该有效:

代码语言:javascript
复制
const BlogTemplate=({ data }){
    if(typeof window !== "undefined"){
      const queryString = window.location.search;
      const urlParams = new URLSearchParams(queryString);
      const urlTag= urlParams.get('tag');
      const filteredPosts= data.allMarkdownRemark.edges.node.filter(node=> node.frontmatter.tag.includes(urlTag))
      const loopData= urlParams.has('tag') ? filteredPosts : data
   }
   
return loopData.allMarkdownRemark.edges.node.map(node=> <h1 key={node.title}>{node.title}</h1>)

}

注意:当然,让它适应你的需要,但是要得到这个想法。

还请注意,您需要将所有窗口逻辑包装在typeof window !== "undefined"条件中,因为in the SSR window (and other global objects) are not available

关键部分是根据URL参数的存在使用是使用data还是使用filteredPosts,因此如果存在,则需要过滤数据,否则需要使用“默认”data (未筛选)。

很难猜测代码将如何运行,但是这个想法依赖于根据URL更改可迭代数据,如果需要的话可以使用一些钩子。

根据您的查询,您的博客似乎在博客模板查询中不包含任何tag字段,因此您需要添加它以允许filter循环工作。

一旦代码正常工作,您将需要添加适当的控件,以避免某些字段丢失时的代码中断,但要遵循的想法和路径是这样的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66221048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档