Next.js Routing

Dynamic Routes

Route parameters, catch-all routes, optional catch-all, and dynamic segments.

Advertisement

Dynamic Routes

Route parameters, catch-all routes, optional catch-all, and dynamic segments.

Overview

Dynamic routes enable flexible URL patterns in Next.js.

Key Concepts

  • Dynamic Segments[param] for single values
  • Catch-All[...slug] for multiple segments
  • Optional Catch-All[[...slug]] for optional segments
  • generateStaticParams — Pre-generate dynamic routes
  • Server Components — Access params in server components

Code Examples

// app/blog/[slug]/page.js
export default async function BlogPost({ params }) {
  const post = await getPost(params.slug);
  return <article>{post.content}</article>;
}

// Generate static params for SSG
export async function generateStaticParams() {
  const posts = await getAllPosts();
  return posts.map(post => ({ slug: post.slug }));
}

// app/shop/[...slug]/page.js
export default async function ShopPage({ params }) {
  // URL: /shop/shoes/nike/air-max
  // params.slug = ['shoes', 'nike', 'air-max']
  return <div>Path: {params.slug.join('/')}</div>;
}

// Optional catch-all
// app/docs/[[...slug]]/page.js
export default async function DocsPage({ params }) {
  // URL: /docs OR /docs/getting-started
  // params.slug = undefined OR ['getting-started']
  const slug = params.slug?.join('/') || 'index';
  return <DocContent slug={slug} />;
}

// Multiple dynamic segments
// app/[category]/[id]/page.js
export default async function ProductPage({ params }) {
  const product = await getProduct(params.category, params.id);
  return <ProductDetails product={product} />;
}

Practice

Build a blog with dynamic routes and static generation.