Espress
2021 November 25th

【Next.js】配列を使用して動的ルーティング生成

SSGまたはISRにするため配列を作成後、ページネーションがある一覧ページのパス生成をしてみました。

profile icon
written by スズキ ハルヤ
article image

はじめに

ページネーション機能のある一覧ページをSSGまたはISRにしようとした際に配列の作成を行い実装したのでこの記事を作成しました。

実装していく上での要点

APIサーバ(Django REST frameworkを使用)とWebサーバ(Next.js)を使用しています。

APIサーバは1ページあたりに表示する記事数を設定しており、Webサーバからリクエストがきた際にページネーションで扱うページ数を返すようにしています。
(1ページあたり表示する記事の数が6で記事数が12の場合、ページ数は2なので2をWebサーバへ返します)

正直なところ、今回のAPIサーバはページネーションで扱っているページ数を返しているだけなのでWebサーバだけでも実現可能ですが、「せっかくならAPIサーバを利用しよう」ということでこんな処理になっています。

実装の流れ

APIサーバへリクエストを送り、ページネーションのページ数を取得。
1から取得したページ数までが埋まった配列を作成後、mapしgetStaticPathsのpathsとして登録します。

なぜ配列を作成する必要があったのか

SSGやISRを実装する上でgetStaticPathsは必須であり、このgetStaticPathsには扱うURLを以下の形式で事前に登録しなければいけないためです。
そのため1からページネーションで扱うページ数までが含まれている配列を用意しなければいけませんでした。

// [id].tsxの時
[
    params: {
        { id: '1' }
    },
    params: {
        { id: '2' }
    }
    // こんな感じで続く
]

JavaScriptでの配列作成

まずはじめに、JavaScriptでの配列作成方法についてご説明します。

最小値から最大値で中身を埋めて配列を作成する関数

1からページネーションで取り扱うページ数までの数値を含んだ配列作成にはstartを1と固定してもいいのですが、汎用性を考慮してstartの値は引数として受け取れるようにしました。

const array = (start, end) =>
    [...Array(end - start -1)].map((_, i) => start + i)

使い方

上記の関数を定義後、以下のコードを実行すると[1,2, 3, 4, 5]となる配列を作成できるかと思います。

array(1, 5);

getStaticPathsの記述

 配列の作成方法を確認できたら、次に本来の目的である動的ルーティングを作成していきます。

export const getStaticPaths = async () => {
    const paths = await [生成するURLを返す関数]();// 後で記述します
    return {
        paths,
        fallback: false// falseにしておくことで生成されていないパスへのアクセスに404を返す
    }
}

生成するURLを返す関数

次にconst pathsに対応する処理を記述していきます。
page_totalはページネーションで扱うページ数を表しています。

import axios from "axios"// インストールも忘れずに

const [登録するURLを返す関数] = async () => {
    const array = (start, end) => 
        [...Array(end - start + 1)].map((_, i) => start + i)

    const res = await axios({
        method: "GET",
        url: [page_totalを返すAPIサーバのURL],
    })
    const page_total = await res.data.page_total;
    return array(1, page_total).map((pageNumber) => {
        return {
            params: {
                id: String(pageNumber)
            }
        }
    });
}

先ほど作成したarray関数を用いて、1からページネーションで扱う数(page_total)までの配列を作成しています。
私はpage_totalを取得するのにaxiosを使用していますが、fetchでも問題ありません。

これでページネーションを扱っている記事一覧のURLを事前に登録しておくことができました。

おわりに

いかがだったでしょうか。

私は今回ページネーションを用いた一覧ページをISRにしたかったため新しく配列を作成し、ダイナミックルートの生成を試みました。

この記事がお役に立てば幸いです。
最後までご覧くださりありがとうございました。

introduction image

- Introduction -

Espressの成り立ちとデジタルクリエイティブにおける想い

introduction image

多くの情報が乱立する中、Espressは記事を読んでくださる皆様に、より良い情報と価値のあるコンテンツをお届けしたいと考えています。また、企業や事業主が掲げる目標達成の手助けをサイト利用者の利便性を捉え、ブランドと読者のより良い結びつきを作ります。

詳しくみる