Gatsby 博客中的上一页和下一页 link
Previous & next page link in Gatsby Blog
我想知道我在我的 Gatsby 网站上尝试创建上一页和下一页 link 时做错了什么,下面是我试图解决的错误。
当我点击上一个或下一个 link 而不是转到请求的页面时,它会创建下面的路由,这是不应该做的!
如果我点击上一个
以及接下来的
我的 Gatsby 代码-node.js 如下
const { createFilePath } = require(`gatsby-source-filesystem`)
const path = require("path")
exports.onCreateNode = ({ node, getNode, actions }) => {
const { createNodeField } = actions
if (node.internal.type === `Mdx`) {
const slug = createFilePath({ node, getNode, basePath: `pages` })
createNodeField({
node,
name: `slug`,
value: slug,
})
}
}
exports.createPages = async ({ graphql, actions }) => {
const { createPage } = actions
const results1 = await graphql(`
query content {
allMdx(filter: { frontmatter: { key: { eq: "projects" } } }) {
nodes {
frontmatter {
slug
title
}
}
}
}
`)
const results2 = await graphql(`
query content {
allMdx(
filter: { frontmatter: { key: { eq: "article" } } }
sort: { fields: frontmatter___date, order: ASC }
) {
nodes {
frontmatter {
slug
title
}
}
}
}
`)
const projectTemplate = path.resolve(`./src/templates/project-details.js`)
const blogTemplate = path.resolve(`./src/templates/blog-details.js`)
if (results1.errors || results2.errors) {
reporter.panicOnBuild(`Error while running GraphQL query.`)
return
}
const posts = results2.data.allMdx.nodes
posts.forEach((post, index) => {
const previous = index === 0 ? null : posts[index - 1]
const next = index === posts.length - 1 ? null : posts[index + 1]
createPage({
path: `/blog/${post.frontmatter.slug}`,
component: blogTemplate,
context: {
slug: post.frontmatter.slug,
previous,
next,
},
})
})
results1.data.allMdx.nodes.forEach(node => {
createPage({
path: `/projects/${node.frontmatter.slug}`,
component: projectTemplate,
context: { slug: node.frontmatter.slug },
})
})
}
我的博文页面代码如下
import React from "react"
import { graphql, Link } from "gatsby"
import { MDXRenderer } from "gatsby-plugin-mdx"
import { GatsbyImage, getImage } from "gatsby-plugin-image"
import Layout from "../components/Layout"
import * as styles from "../styles/blog-details.module.css"
const BlogPosts = ({ data, pageContext }) => {
console.log(pageContext)
const { body } = data.article
const { title, date, stack, featuredImg } = data.article.frontmatter
const { previous, next } = pageContext
return (
<Layout>
<div className={styles.details}>
<h2>{title}</h2>
<p>{date}</p>
<p>{stack}</p>
<div className={styles.featured}>
<GatsbyImage
image={getImage(featuredImg.childImageSharp.gatsbyImageData)}
alt={title}
/>
</div>
<article className={styles.body}>
<MDXRenderer>{body}</MDXRenderer>
</article>
{previous && (
<Link to={previous.frontmatter.slug}>
<h5>{previous.frontmatter.title}</h5>
</Link>
)}
{next && (
<Link to={next.frontmatter.slug}>
<h5>{next.frontmatter.title}</h5>
</Link>
)}
</div>
</Layout>
)
}
export default BlogPosts
export const query = graphql`
query BlogDetails($slug: String) {
article: mdx(frontmatter: { slug: { eq: $slug }, key: { eq: "article" } }) {
body
frontmatter {
slug
key
title
date
stack
featuredImg {
childImageSharp {
gatsbyImageData(placeholder: BLURRED, layout: FULL_WIDTH)
}
}
}
}
}
`
在此先感谢您对此的帮助。
如果我没理解错的话,单击上一个和下一个按钮时生成的 URL 是将 post 的 slug“连接”到当前的 URL 而不是替换它,不是吗?
因此,不是像 localhost:8000/blog/next-article
那样创建 URL,而是生成 localhost:8000/blog/current-article/next-article
。
这是因为您生成链接的方式。您可以通过将鼠标悬停在链接上来发现链接路径,以查看 previous/next 文章的 URL 被添加到 URL 的末尾而不是替换它。
这是因为您没有为链接添加正确的相关性。只需使用:
{previous && (
<Link to={`/blog/${previous.frontmatter.slug}`}>
<h5>{previous.frontmatter.title}</h5>
</Link>
)}
{next && (
<Link to={`/blog/${next.frontmatter.slug}`}>
<h5>{next.frontmatter.title}</h5>
</Link>
)}
to
属性 以斜线开头 (/
) 修正了相对论。因为您的文章位于 /blog/
页面内,您需要将其添加到路径中。
这也是锚点 (<a>
) 在 HTML 中的工作方式。
我想知道我在我的 Gatsby 网站上尝试创建上一页和下一页 link 时做错了什么,下面是我试图解决的错误。
当我点击上一个或下一个 link 而不是转到请求的页面时,它会创建下面的路由,这是不应该做的!
如果我点击上一个
以及接下来的
我的 Gatsby 代码-node.js 如下
const { createFilePath } = require(`gatsby-source-filesystem`)
const path = require("path")
exports.onCreateNode = ({ node, getNode, actions }) => {
const { createNodeField } = actions
if (node.internal.type === `Mdx`) {
const slug = createFilePath({ node, getNode, basePath: `pages` })
createNodeField({
node,
name: `slug`,
value: slug,
})
}
}
exports.createPages = async ({ graphql, actions }) => {
const { createPage } = actions
const results1 = await graphql(`
query content {
allMdx(filter: { frontmatter: { key: { eq: "projects" } } }) {
nodes {
frontmatter {
slug
title
}
}
}
}
`)
const results2 = await graphql(`
query content {
allMdx(
filter: { frontmatter: { key: { eq: "article" } } }
sort: { fields: frontmatter___date, order: ASC }
) {
nodes {
frontmatter {
slug
title
}
}
}
}
`)
const projectTemplate = path.resolve(`./src/templates/project-details.js`)
const blogTemplate = path.resolve(`./src/templates/blog-details.js`)
if (results1.errors || results2.errors) {
reporter.panicOnBuild(`Error while running GraphQL query.`)
return
}
const posts = results2.data.allMdx.nodes
posts.forEach((post, index) => {
const previous = index === 0 ? null : posts[index - 1]
const next = index === posts.length - 1 ? null : posts[index + 1]
createPage({
path: `/blog/${post.frontmatter.slug}`,
component: blogTemplate,
context: {
slug: post.frontmatter.slug,
previous,
next,
},
})
})
results1.data.allMdx.nodes.forEach(node => {
createPage({
path: `/projects/${node.frontmatter.slug}`,
component: projectTemplate,
context: { slug: node.frontmatter.slug },
})
})
}
我的博文页面代码如下
import React from "react"
import { graphql, Link } from "gatsby"
import { MDXRenderer } from "gatsby-plugin-mdx"
import { GatsbyImage, getImage } from "gatsby-plugin-image"
import Layout from "../components/Layout"
import * as styles from "../styles/blog-details.module.css"
const BlogPosts = ({ data, pageContext }) => {
console.log(pageContext)
const { body } = data.article
const { title, date, stack, featuredImg } = data.article.frontmatter
const { previous, next } = pageContext
return (
<Layout>
<div className={styles.details}>
<h2>{title}</h2>
<p>{date}</p>
<p>{stack}</p>
<div className={styles.featured}>
<GatsbyImage
image={getImage(featuredImg.childImageSharp.gatsbyImageData)}
alt={title}
/>
</div>
<article className={styles.body}>
<MDXRenderer>{body}</MDXRenderer>
</article>
{previous && (
<Link to={previous.frontmatter.slug}>
<h5>{previous.frontmatter.title}</h5>
</Link>
)}
{next && (
<Link to={next.frontmatter.slug}>
<h5>{next.frontmatter.title}</h5>
</Link>
)}
</div>
</Layout>
)
}
export default BlogPosts
export const query = graphql`
query BlogDetails($slug: String) {
article: mdx(frontmatter: { slug: { eq: $slug }, key: { eq: "article" } }) {
body
frontmatter {
slug
key
title
date
stack
featuredImg {
childImageSharp {
gatsbyImageData(placeholder: BLURRED, layout: FULL_WIDTH)
}
}
}
}
}
`
在此先感谢您对此的帮助。
如果我没理解错的话,单击上一个和下一个按钮时生成的 URL 是将 post 的 slug“连接”到当前的 URL 而不是替换它,不是吗?
因此,不是像 localhost:8000/blog/next-article
那样创建 URL,而是生成 localhost:8000/blog/current-article/next-article
。
这是因为您生成链接的方式。您可以通过将鼠标悬停在链接上来发现链接路径,以查看 previous/next 文章的 URL 被添加到 URL 的末尾而不是替换它。
这是因为您没有为链接添加正确的相关性。只需使用:
{previous && (
<Link to={`/blog/${previous.frontmatter.slug}`}>
<h5>{previous.frontmatter.title}</h5>
</Link>
)}
{next && (
<Link to={`/blog/${next.frontmatter.slug}`}>
<h5>{next.frontmatter.title}</h5>
</Link>
)}
to
属性 以斜线开头 (/
) 修正了相对论。因为您的文章位于 /blog/
页面内,您需要将其添加到路径中。
这也是锚点 (<a>
) 在 HTML 中的工作方式。