gpt4 book ai didi

javascript - 如何创建单个 Gatsby 页面以按标签/类别显示和过滤所有博客文章

转载 作者:行者123 更新时间:2023-12-04 08:06:05 24 4
gpt4 key购买 nike

您好,我正在使用 Gatsby 和 Netlify CMS 构建博客。我从 gatsby-starter-netlify-cms 模板开始。
我有 /blog我目前显示所有帖子的页面以及所有标签的列表。
当用户点击一个标签时,它当前被重定向到 tags/name-of-tag页面,其中显示了所有标记为这样的帖子的列表。
我想要的 是直接过滤列表上的/blog页。
这样,我将只有一个页面来按标签(也可能按术语搜索)显示和过滤博客文章。
所以标签链接应该重定向到/blog?tag-name或类似的东西。
我不确定如何告诉 Gatsby 创建一个可以注入(inject) filter 的页面值以便将其传递给页面查询..
这就是 /tags/当前创建的页面:

// 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,
},
})
})
这是我的博客页面查询(我希望能够按标签过滤):
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
}
}
}
}
}
}
}
}
`

最佳答案

I'm not sure how to tell Gatsby to create a single page withpossibility to inject a filter value in order to pass it to the pagequery.


你不能。在页面查询中过滤数据的唯一方法是使用上下文传递数据。就像您在标签页面中所做的那样:
  createPage({
path: tagPath,
component: path.resolve(`src/templates/tags.js`),
context: {
tag,
},
})
最简单的本地方法是使用 /tag/tag-name页面,旨在按标签名称过滤,否则,您将需要获取 URL 参数并在 JavaScript filter 中使用它函数过滤来自页面查询的所有数据。由于您缺少博客页面的渲染部分......这种方法应该可以工作:
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 .
关键部分是使用 data或您的 filteredPosts取决于URL参数的存在,所以如果存在则需要过滤数据,否则需要使用“默认” data (未过滤)。
很难猜测代码的行为方式,但这个想法依赖于根据 URL 更改可迭代数据,如果需要,请使用一些钩子(Hook)。
根据您的查询,您的博客似乎不包含任何 tag博客模板查询中的字段,因此您需要添加它以允许 filter循环工作。
一旦代码正常工作,您将需要添加适当的控件以避免在缺少某些字段时发生代码破坏,但想法和遵循的路径是这样的。

关于javascript - 如何创建单个 Gatsby 页面以按标签/类别显示和过滤所有博客文章,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66221048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com