post: 2023-01-05
update: 2023-01-06
INDEX ▶
Next.jsのブログにページングをつけてみた

自分のブログにページングついてないということに気づいていたが、良くも悪くもコンテンツがまだページングするほどではないためスルーしていました。
いい加減つけておこうと思い立ち対応しました。
microCMSのガイドがあったのでそれに沿って対応しました。
https://blog.microcms.io/next-pagination/
流れとしては上記記事の通りです
- ページングコンポーネントを作成する
 - ブログ一覧ページにページングコンポーネントを導入する
 - ページング個別ページを作成する
 
ページングコンポーネントを作成する
記事に掲載されたコードをベースに下記を追加で対応しました
- tsx化
 - tailwindでスタイリング
 - 1ページごとのコンテンツ数を定義
 
import Link from "next/link"
type PagenationProps = {
  totalCount: number
}
export const Pagination = (props: PagenationProps) => {
  const totalCount = props.totalCount
  const range = (start: number, end: number) =>
    [...Array(end - start + 1)].map((_, i) => start + i)
  return (
    <nav aria-label="Page navigation example">
      <ul className="inline-flex items-center -space-x-px">
        {range(1, Math.ceil(totalCount / PER_PAGE)).map((number, index) => (
          <li key={index}>
            <Link href={`/blogs/page/${number}`}>
              <a className="px-3 py-2 leading-tight text-gray-500 bg-white border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white">
                {number}
              </a>
            </Link>
          </li>
        ))}
      </ul>
    </nav>
  )
}
// TODO: 本来はもうちょっと数を増やすべきだが、ページングのテストのため5件にしている
export const PER_PAGE = 5ブログ一覧ページにページングコンポーネントを導入する
- getStaticPropsのパラメータにtotalCount(コンテンツ件数)を追加
 
type StaticProps = {
  blogList: BlogListResponse
  totalCount: number  // 追加
}
export const getStaticProps: GetStaticProps<StaticProps> = async () => {
  // 省略
   const totalCount = blogList.totalCount
  // 省略
  return {
    props: { blogList, totalCount },
  }
  // 省略- ページングコンポーネントを追加
 
<Pagination totalCount={totalCount} />ページング個別ページを作成する
- src/pages/blogs/page/[id].tsx を作成する
 - getStaticPaths でページのパスを定義する
 
export const getStaticPaths = async () => {
  const repos = await client.get({ endpoint: "blogs" })
  const pageNumbers = []
  const range = (start: number, end: number) =>
    [...Array(end - start + 1)].map((_, i) => start + i)
  const paths = range(1, Math.ceil(repos.totalCount / PER_PAGE)).map(
    (repo) => `/blogs/page/${repo}`
  )
  return { paths, fallback: false }
}- getStaticProps でページング個別ページのパラメータを定義する
 
export const getStaticProps: GetStaticProps<StaticProps> = async (context) => {
  const { params } = context
  if (!params?.id) {
    throw new Error("Error: ID not found")
  }
  const id = Number(params.id)
  const data = await client.get({
    endpoint: "blogs",
    queries: { offset: (id - 1) * 5, limit: 5 },
  })
  return {
    props: {
      blogs: data,
      totalCount: data.totalCount,
    },
  }
}完成
以上!