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'] } |