ダイナミックルートセグメント
事前に正確なルートセグメント名が分からず、動的なデータからルートを作成したい場合、リクエスト時に埋められるまたはビルド時に事前レンダリングされるダイナミックセグメントを使用できます。
規約
ダイナミックセグメントは、フォルダ名を角括弧で囲むことで作成できます: [folderName]
。例えば、ブログでは app/blog/[slug]/page.js
というルートを含めることができ、[slug]
はブログ投稿のダイナミックセグメントです。
ダイナミックセグメントは layout
、page
、route
、generateMetadata
関数に params
プロップとして渡されます。
ルート | 例のURL | params |
---|---|---|
app/blog/[slug]/page.js | /blog/a | { slug: 'a' } |
app/blog/[slug]/page.js | /blog/b | { slug: 'b' } |
app/blog/[slug]/page.js | /blog/c | { slug: 'c' } |
キャッチオールセグメント
ダイナミックセグメントは、括弧内に省略記号を追加することで、後続のセグメントをキャッチオールするように拡張できます [...folderName]
。
例えば、app/shop/[...slug]/page.js
は /shop/clothes
だけでなく、/shop/clothes/tops
、/shop/clothes/tops/t-shirts
などにもマッチします。
ルート | 例のURL | params |
---|---|---|
app/shop/[...slug]/page.js | /shop/a | { slug: ['a'] } |
app/shop/[...slug]/page.js | /shop/a/b | { slug: ['a', 'b'] } |
app/shop/[...slug]/page.js | /shop/a/b/c | { slug: ['a', 'b', 'c'] } |
オプショナルキャッチオールセグメント
キャッチオールセグメントは、パラメータを二重角括弧で囲むことでオプショナルにできます: [[...folderName]]
。
例えば、app/shop/[[...slug]]/page.js
は /shop/clothes
、/shop/clothes/tops
、/shop/clothes/tops/t-shirts
に加えて、/shop
にもマッチします。
キャッチオールセグメントとオプショナルキャッチオールセグメントの違いは、オプショナルの場合、パラメータなしのルート(上記の例では /shop
)にもマッチすることです。
ルート | 例のURL | params |
---|---|---|
app/shop/[[...slug]]/page.js | /shop | { slug: undefined } |
app/shop/[[...slug]]/page.js | /shop/a | { slug: ['a'] } |
app/shop/[[...slug]]/page.js | /shop/a/b | { slug: ['a', 'b'] } |
app/shop/[[...slug]]/page.js | /shop/a/b/c | { slug: ['a', 'b', 'c'] } |
TypeScript
TypeScriptを使用する場合、設定したルートセグメントに応じて params
の型を追加できます。
ルート | params 型定義 |
---|---|
app/blog/[slug]/page.js | { slug: string } |
app/shop/[...slug]/page.js | { slug: string[] } |
app/shop/[[...slug]]/page.js | { slug?: string[] } |
app/[categoryId]/[itemId]/page.js | { categoryId: string, itemId: string } |
動作
params
プロップはPromiseであるため、値にアクセスするにはasync
/await
またはReactのuse関数を使用する必要があります。- バージョン14以前では、
params
は同期プロップでした。後方互換性のために、Next.js 15でも同期的にアクセスできますが、この動作は将来非推奨になります。
- バージョン14以前では、
例
generateStaticParams
と一緒に使用
generateStaticParams
関数を使用すると、リクエスト時にオンデマンドで生成する代わりに、ビルド時にルートを静的生成できます。
generateStaticParams
関数内で fetch
を使用すると、リクエストは自動的に重複排除されます。これにより、レイアウト、ページ、その他の generateStaticParams
関数に対して同じデータの複数のネットワーク呼び出しが回避され、ビルド時間が短縮されます。