コンテンツへスキップ

動的ルーティング

セグメントの正確な名前を事前に知らない場合や、動的なデータからルートを作成したい場合は、リクエスト時に埋め込まれるか、ビルド時に事前レンダリングされる動的セグメントを使用できます。

命名規則

動的セグメントは、ファイルまたはフォルダ名を角括弧で囲むことで作成できます: [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'] }