概要
はじめまして!
最近Next.jsの学習をはじめましたが、個人開発において動的にパスを生成したくなったので、Dynamic Routesについて少しまとめてみました。
Dynamic Routes is 何?
Convention
A Dynamic Segment can be created by wrapping a folder's name in square brackets: [folderName]. For example, [id] or [slug].
Dynamic Segments can be accessed from useRouter.
Example
For example, a blog could include the following route pages/blog/[slug].js where [slug] is the Dynamic Segment for blog posts.
Next.js13系では、app/配下のディレクトリがルーティングと紐づいており、ディレクトリ名がそのままパス名になる仕組みになっています。
例えば、カラムとして保持してるslugをパスとして指定したい場合、ブラケット付きのディレクトリ名[slug]
で作成することで そのカラム名で動的にパスを作ることができます。
現在のディレクトリ構造
.
└── app
├── favicon.ico
├── globals.css
├── layout.tsx
├── page.tsx
└── works
└── page.tsx
やりたいこと
現状は/works
に遷移できます。
この/works
から、/works/trial
や/works/basic
のように単一ページでパスを作れるようにします。
import Link from 'next/link';
export default function () {
return (
<div>
<h1 className="text-3xl font-bold">/worksだよ</h1>
</div>
);
}
検証
ドキュメント通り、works配下にブラケット付きの[slug]
ディレクトリとpage.tsx
を作成します。
tree
.
└── app
├── favicon.ico
├── globals.css
├── layout.tsx
├── page.tsx
└── works
├── [slug]
│ └── page.tsx
└── page.tsx
works/page.tsx
にリンクを追加します。
import Link from 'next/link';
export default function Home() {
return (
<div>
<h1 className="text-3xl font-bold">/worksだよ</h1>
<nav>
<ul>
<li>
<Link href="/">Home</Link>
</li>
<li>
<Link href="/works/trial">Trial</Link>
</li>
<li>
<Link href="/works/basic">Basic</Link>
</li>
<li>
<Link href="/works/intermediate">Intermediate</Link>
</li>
</ul>
</nav>
</div>
);
}
works/[slug]/page.tsx
に受け取ったパスを表示できるようにします。
'use client';
import { usePathname } from 'next/navigation';
export default function Page() {
const Pathname = usePathname();
return <h1 className="text-3xl font-bold">パス: {Pathname}</h1>;
}
まとめ
Next.jsを学んでいますが、レンダリングの選択肢や、コンポーネント設計、Hookの使い方など、たくさん勉強することがあるのでこれからも地道に勉強していきたいです!
最後まで読んでいただき、ありがとうございました!