Dynamic Routes
あらかじめ正確なセグメント名を知らない場合や、routes を Dynamic データから作成したい場合は、dynamic Segments を使用して、request 時に入力したり、build 時にprerenderedしたりできます。
Convention
Dynamic セグメントは、ファイル名やフォルダ名を角括弧で囲むことで作成できます:[segmentName]。例えば、[id]や[slug]のようになります。
Dynamic セグメントは、useRouterからアクセスできます。
Example
たとえば、ブログには次のような routepages/blog/[slug].jsが含まれることがあります。ここで、[slug]はブログ投稿のための Dynamic セグメントです。
import { useRouter } from "next/router";
export default function Page() {
const router = useRouter();
return <p>Post: {router.query.slug}</p>;
}
| Route | Example URL | params |
|---|---|---|
pages/blog/[slug].js | /blog/a | { slug: 'a' } |
pages/blog/[slug].js | /blog/b | { slug: 'b' } |
pages/blog/[slug].js | /blog/c | { slug: 'c' } |
Catch-all Segments
Dynamic セグメントは、ブラケット内に省略記号を追加することで、後続のセグメントをすべてcatch-allできるように拡張できます。[...segmentName]。
例えば、pages/shop/[...slug].jsは/shop/clothesに一致しますが、/shop/clothes/tops、/shop/clothes/tops/t-shirtsなども一致します。
| Route | Example URL | params |
|---|---|---|
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'] } |
Optional Catch-all Segments
Catch-all セグメントはダブルスクエアブラケット内にパラメータを含めることでオプショナルにすることができます:[[...segmentName]]。
たとえば、pages/shop/[[...slug]].jsは、/shop/clothes、/shop/clothes/tops、/shop/clothes/tops/t-shirtsに加えて、/shopとも一致します。
catch-all と optional catch-all セグメントの違いは、オプショナルの場合、パラメーターがないルートもマッチする点です(上記の例では /shop)。
| Route | Example URL | params |
|---|---|---|
pages/shop/[[...slug]].js | /shop | { slug: [] } |
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'] } |