動的ルーティング
セグメントの正確な名前を事前に知らない場合や、動的なデータからルートを作成したい場合は、リクエスト時に埋め込まれるか、ビルド時に事前レンダリングされる動的セグメントを使用できます。
命名規則
動的セグメントは、ファイルまたはフォルダ名を角括弧で囲むことで作成できます: [segmentName]
。例えば、[id]
や [slug]
です。
動的セグメントにはuseRouter
からアクセスできます。
例
例えば、ブログではpages/blog/[slug].js
というルートを含めることができます。ここで[slug]
はブログ投稿の動的セグメントです。
import { useRouter } from 'next/router'
export default function Page() {
const router = useRouter()
return <p>Post: {router.query.slug}</p>
}
ルート | URLの例 | パラメーター |
---|---|---|
pages/blog/[slug].js | /blog/a | { slug: 'a' } |
pages/blog/[slug].js | /blog/b | { slug: 'b' } |
pages/blog/[slug].js | /blog/c | { slug: 'c' } |
キャッチオールセグメント
動的セグメントは、角括弧の中に省略記号 [...segmentName]
を追加することで、後続のセグメントを**すべてキャッチ**するように拡張できます。
例えば、pages/shop/[...slug].js
は /shop/clothes
にマッチするだけでなく、/shop/clothes/tops
、/shop/clothes/tops/t-shirts
などにもマッチします。
ルート | URLの例 | パラメーター |
---|---|---|
pages/shop/[...slug].js | /shop/a | { slug: ['a'] } |
pages/shop/[...slug].js | /shop/a/b | { slug: ['a', 'b'] } |
pages/shop/[...slug].js | /shop/a/b/c | { slug: ['a', 'b', 'c'] } |
オプションのキャッチオールセグメント
キャッチオールセグメントは、パラメーターを二重の角括弧 [[...segmentName]]
で囲むことで、**オプション**にできます。
例えば、pages/shop/[[...slug]].js
は /shop/clothes
、/shop/clothes/tops
、/shop/clothes/tops/t-shirts
に加えて、/shop
にも**マッチします**。
**キャッチオール**と**オプションのキャッチオール**セグメントの違いは、オプションの場合、パラメーターなしのルートもマッチすることです(上記の例では/shop
)。
ルート | URLの例 | パラメーター |
---|---|---|
pages/shop/[[...slug]].js | /shop | { slug: undefined } |
pages/shop/[[...slug]].js | /shop/a | { slug: ['a'] } |
pages/shop/[[...slug]].js | /shop/a/b | { slug: ['a', 'b'] } |
pages/shop/[[...slug]].js | /shop/a/b/c | { slug: ['a', 'b', 'c'] } |
次のステップ
次に何をするべきかについては、以下のセクションをお勧めします
お役に立ちましたか?