最后一页上的 Gatsby 博客分页禁用按钮
Gatsby blog pagination disable button on the last page
我在 Gatsby 中设置博客分页是这样的:
gatsby-node.js
文件:
exports.createPages = async ({ graphql, actions }) => {
const { createPage } = actions
const result = await graphql(`
query {
allContentfulPost(sort: { order: ASC, fields: [createdAt] }) {
edges {
node {
postTitle
slug
}
}
}
}
`)
const postsPerPage = 2
const numPages = Math.ceil(posts.length / postsPerPage)
Array.from({ length: numPages }).forEach((_, i) => {
createPage({
path: i === 0 ? `/blog` : `/blog/${i + 1}`,
component: path.resolve("./src/templates/blog.js"),
context: {
limit: postsPerPage,
skip: i * postsPerPage,
numPages,
currentPage: i + 1,
},
})
})
}
然后在 blog.js
文件中添加按钮和页码,如下所示:
function Blog({ pageContext, data }) {
const { currentPage, numPages } = pageContext
const isFirst = currentPage === 1
const isLast = currentPage === numPages
const prevPage = currentPage - 1 === 1 ? "" : (currentPage - 1).toString()
const nextPage = (currentPage + 1).toString()
return (
<PaginationContainer>
<FlatButton
item={
!isFirst && {
title: "Previous Page",
icon: "/images/icons/left-arrow.svg",
link: `/blog/${prevPage}`,
}
}
/>
<PageNumbersContainer>
{Array.from({ length: numPages }, (_, i) => (
<PageNumber
item={{
title: `${i + 1}`,
icon: "",
link: `/blog/${i === 0 ? "" : i + 1}`,
key: `pagination-number${i + 1}`,
}}
/>
))}
</PageNumbersContainer>
<FlatButton
item={
!isLast && {
title: "Next Page",
icon: "/images/icons/right-arrow.svg",
link: `/blog/${nextPage}`,
}
}
/>
</PaginationContainer>
)}
现在,当没有上一页或下一页时,按钮中的 title
消失,只有容器在那里。
我想保持标题和按钮形状不变,但要将其禁用 (un-cklickable)
非常感谢你的帮助。
如果你想保留 title
你只需要删除条件并保留组件,如:
<FlatButton
item={
{
title: "Next Page",
icon: "/images/icons/right-arrow.svg",
link: `/blog/${nextPage}`,
}
}
/>
要禁用该按钮,您有多种解决方法。最简单和原生的是,如果你的 FlatButton
组件从任何 button
标签扩展,你可以传递一个 isDisabled
prop
像:
<FlatButton
item={
{
isDisabled: isLast
title: "Next Page",
icon: "/images/icons/right-arrow.svg",
link: `/blog/${nextPage}`,
}
}
/>
然后,在你的组件中:
const FlatButton = ({ item })=>{
return <button disabled={item.isDisabled}>{item.title}</button>
}
当然,在不知道您的 FlatButton
看起来如何的情况下,您需要稍微调整一下,但您明白了。
否则,您可以使用组件的 class 名称并使用 pointer-events: none
CSS 规则等样式。
how do i select isDisabled
in css? using styled components
喜欢 styled-components 中的所有道具:
color: ${props => props.isDisabled? "white" : "red"};
我在 Gatsby 中设置博客分页是这样的:
gatsby-node.js
文件:
exports.createPages = async ({ graphql, actions }) => {
const { createPage } = actions
const result = await graphql(`
query {
allContentfulPost(sort: { order: ASC, fields: [createdAt] }) {
edges {
node {
postTitle
slug
}
}
}
}
`)
const postsPerPage = 2
const numPages = Math.ceil(posts.length / postsPerPage)
Array.from({ length: numPages }).forEach((_, i) => {
createPage({
path: i === 0 ? `/blog` : `/blog/${i + 1}`,
component: path.resolve("./src/templates/blog.js"),
context: {
limit: postsPerPage,
skip: i * postsPerPage,
numPages,
currentPage: i + 1,
},
})
})
}
然后在 blog.js
文件中添加按钮和页码,如下所示:
function Blog({ pageContext, data }) {
const { currentPage, numPages } = pageContext
const isFirst = currentPage === 1
const isLast = currentPage === numPages
const prevPage = currentPage - 1 === 1 ? "" : (currentPage - 1).toString()
const nextPage = (currentPage + 1).toString()
return (
<PaginationContainer>
<FlatButton
item={
!isFirst && {
title: "Previous Page",
icon: "/images/icons/left-arrow.svg",
link: `/blog/${prevPage}`,
}
}
/>
<PageNumbersContainer>
{Array.from({ length: numPages }, (_, i) => (
<PageNumber
item={{
title: `${i + 1}`,
icon: "",
link: `/blog/${i === 0 ? "" : i + 1}`,
key: `pagination-number${i + 1}`,
}}
/>
))}
</PageNumbersContainer>
<FlatButton
item={
!isLast && {
title: "Next Page",
icon: "/images/icons/right-arrow.svg",
link: `/blog/${nextPage}`,
}
}
/>
</PaginationContainer>
)}
现在,当没有上一页或下一页时,按钮中的 title
消失,只有容器在那里。
我想保持标题和按钮形状不变,但要将其禁用 (un-cklickable)
非常感谢你的帮助。
如果你想保留 title
你只需要删除条件并保留组件,如:
<FlatButton
item={
{
title: "Next Page",
icon: "/images/icons/right-arrow.svg",
link: `/blog/${nextPage}`,
}
}
/>
要禁用该按钮,您有多种解决方法。最简单和原生的是,如果你的 FlatButton
组件从任何 button
标签扩展,你可以传递一个 isDisabled
prop
像:
<FlatButton
item={
{
isDisabled: isLast
title: "Next Page",
icon: "/images/icons/right-arrow.svg",
link: `/blog/${nextPage}`,
}
}
/>
然后,在你的组件中:
const FlatButton = ({ item })=>{
return <button disabled={item.isDisabled}>{item.title}</button>
}
当然,在不知道您的 FlatButton
看起来如何的情况下,您需要稍微调整一下,但您明白了。
否则,您可以使用组件的 class 名称并使用 pointer-events: none
CSS 规则等样式。
how do i select
isDisabled
in css? using styled components
喜欢 styled-components 中的所有道具:
color: ${props => props.isDisabled? "white" : "red"};