Nextjs Dynamic Routes And Url Parameters Complete Guide

 Last Update:2025-06-22T00:00:00     .NET School AI Teacher - SELECT ANY TEXT TO EXPLANATION.    7 mins read      Difficulty-Level: beginner

Understanding the Core Concepts of Nextjs Dynamic Routes and URL Parameters

Next.js Dynamic Routes and URL Parameters: A Comprehensive Guide

Understanding Dynamic Routes

Dynamic routing involves creating pages in your Next.js app with paths that contain dynamic segments. These segments can correspond to different data points and help in generating pages for each item in a dataset automatically.

Creating Dynamic Routes

To create a dynamic route in Next.js, you need to add a file with square brackets ([param]) to the pages directory. Here's a step-by-step guide:

  1. Create a Dynamic Page File:

    • Navigate to the pages directory in your Next.js project.
    • Create a new directory for your pages (for example, pages/products).
    • Inside this directory, create a file named [id].js. Now, pages/products/[id].js will become a dynamic route, with id being a dynamic segment of the URL.
  2. Accessing Dynamic Parameters:

    • Inside the [id].js file, you can access the dynamic segment using the router object from next/router.
    • Example:
      import { useRouter } from 'next/router'
      
      const Product = () => {
        const router = useRouter()
        const { id } = router.query
      
        return <div>Product ID: {id}</div>
      }
      
      export default Product
      
  3. Fetching Data Based on Dynamic Parameters:

    • Use getStaticPaths and getStaticProps (for static generation) or getServerSideProps (for server-side rendering) to fetch data based on the dynamic parameters.
    • Example with getStaticProps:
      import { useRouter } from 'next/router'
      
      const Product = ({ product }) => {
        return <div>Product Name: {product.name}</div>
      }
      
      export async function getStaticPaths() {
        // Fetch the list of product IDs
        const res = await fetch('https://.../products')
        const products = await res.json()
      
        // Generate array of IDs
        const paths = products.map((product) => ({
          params: { id: product.id },
        }))
      
        // Pre-render only these paths at build time
        // { fallback: false } means other routes should 404
        return { paths, fallback: false }
      }
      
      export async function getStaticProps({ params }) {
        // Fetch necessary data for the product using params.id
        const res = await fetch(`https://.../products/${params.id}`)
        const product = await res.json()
      
        // Pass product data to the page via props
        return { props: { product } }
      }
      
      export default Product
      
  4. Using getServerSideProps:

    • This method fetches data at request time.
    • Example:
      const Product = ({ product }) => {
        return <div>Product Name: {product.name}</div>
      }
      
      export async function getServerSideProps({ params }) {
        // Fetch necessary data for the product using params.id
        const res = await fetch(`https://.../products/${params.id}`)
        const product = await res.json()
      
        // Pass product data to the page via props
        return { props: { product } }
      }
      
      export default Product
      
  5. Handling Multiple Dynamic Segments:

    • You can also create routes with multiple dynamic segments.
    • Example: pages/products/[category]/[id].js
    • Accessing both segments:
      import { useRouter } from 'next/router'
      
      const Product = () => {
        const router = useRouter()
        const { category, id } = router.query
      
        return (
          <div>
            Category: {category}
            <br />
            Product ID: {id}
          </div>
        )
      }
      
      export default Product
      
  6. Generating Static Pages for Multiple Dynamic Segments:

    • In getStaticPaths, you generate combinations of route parameters.
    • Example:
      export async function getStaticPaths() {
        // Fetch products and categories
        const productsRes = await fetch('https://.../products')
        const products = await productsRes.json()
      
        const categoriesRes = await fetch('https://.../categories')
        const categories = await categoriesRes.json()
      
        // Combine categories and products to generate all possible routes
        const paths = products.flatMap(product =>
          categories.map(category => ({
            params: { category: category.name, id: product.id },
          }))
        )
      
        return { paths, fallback: false }
      }
      
  7. Optional Dynamic Segments:

    • By using square brackets inside square brackets ([[...param]]), you can create optional dynamic segments.
    • Example: [[...slug]] allows for URLs like /users, /users/john, and /users/john/profile.
    • Accessing optional dynamic segments:
      import { useRouter } from 'next/router'
      
      const User = () => {
        const router = useRouter()
        const { slug } = router.query
      
        return <div>Slugs: {slug ? slug.join(' / ') : 'No slugs provided'}</div>
      }
      
      export default User
      
  8. Dynamic Routes with Query Parameters:

    • Sometimes you might want to combine dynamic routes with query parameters.
    • Example URL: /products/1?sort=date
    • Accessing query parameters:
      import { useRouter } from 'next/router'
      
      const Product = () => {
        const router = useRouter()
        const { id, sort } = router.query
      
        return (
          <div>
            Product ID: {id}
            <br />
            Sort order: {sort}
          </div>
        )
      }
      
      export default Product
      
  9. Conclusion:

Dynamic routes and URL parameters in Next.js empower you to build flexible and scalable web applications. By leveraging dynamic segments and different fetching methods, you can efficiently handle data-driven pages, enhancing both user experience and site performance.

Important Points:

  • Square Brackets: Create dynamic routes by placing [param] inside your page filenames.
  • Router Hook: Use useRouter to access dynamic parameters and query strings in functional components.
  • Static Generation: Use getStaticProps and getStaticPaths for pre-rendering static pages at build time.
  • Server-Side Rendering: Use getServerSideProps for fetching data at request time.
  • Optional Segments: Use [[...param]] for routes that can have an optional number of segments.
  • Query Parameters: Combine dynamic routes with query parameters for additional flexibility.

Online Code run

🔔 Note: Select your programming language to check or run code at

💻 Run Code Compiler

Step-by-Step Guide: How to Implement Nextjs Dynamic Routes and URL Parameters

Step 1: Set Up Your Next.js Project

If you haven't already set up a Next.js project, you can do so by running the following command in your terminal:

npx create-next-app@latest my-nextjs-dynamic-routes
cd my-nextjs-dynamic-routes

Step 2: Create a Dynamic Route

Dynamic routes in Next.js are created by adding square brackets [] to the page name. For example, if you want to create a dynamic route for blog posts, you would create a file at pages/posts/[id].js.

Create these files:

  • pages/posts/index.js
  • pages/posts/[id].js

pages/posts/index.js

This file will serve as the landing page for all posts. You can list all the posts here with links to individual posts.

import Link from 'next/link';

export default function PostsIndex() {
  const posts = [
    { id: 1, title: 'Introduction to Next.js' },
    { id: 2, title: 'Routing in Next.js' },
    { id: 3, title: 'Dynamic Routing in Next.js' },
  ];

  return (
    <div>
      <h1>Posts</h1>
      <ul>
        {posts.map((post) => (
          <li key={post.id}>
            <Link href={`/posts/${post.id}`} legacyBehavior>
              <a>{post.title}</a>
            </Link>
          </li>
        ))}
      </ul>
    </div>
  );
}

pages/posts/[id].js

This file will display the details of a specific post. We will use the useRouter hook from Next.js to get the dynamic id from the URL.

import { useRouter } from 'next/router';
import { useEffect, useState } from 'react';

export default function Post() {
  const { query } = useRouter();
  const [post, setPost] = useState(null);

  useEffect(() => {
    // Simulate fetching data based on the post id
    const fetchPost = async (id) => {
      // Here you can use an API URL instead of hard-coded data
      const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`);
      const data = await response.json();
      setPost(data);
    };

    if (query.id) {
      fetchPost(query.id);
    }
  }, [query.id]);

  if (!post) return <div>Loading...</div>;

  return (
    <div>
      <h1>{post.title}</h1>
      <p>{post.body}</p>
    </div>
  );
}

Step 3: Test Your Dynamic Routes

Run your Next.js development server by executing:

npm run dev

Navigate to http://localhost:3000/posts in your browser. You should see a list of posts. Clicking on a post title should take you to the individual post page with the corresponding details.

Step 4: Handling Optional and Catch-All Routes (Advanced)

Next.js also supports optional and catch-all routes.

Optional Route

An optional route is created by placing the parameter inside double square brackets [[...id]]. For example, pages/posts/[[...id]].js.

Catch-All Route

A catch-all route will match zero or more path segments. You can create a catch-all route by placing three dots ... inside the brackets.

Let's create a catch-all route for handling nested posts:

Create pages/posts/[...slug].js

import { useRouter } from 'next/router';

export default function Post() {
  const { slug } = useRouter();

  // Use the slug array to handle nested paths
  return (
    <div>
      <h1>Nested Post: {slug.join(' / ')}</h1>
    </div>
  );
}

Now, visiting http://localhost:3000/posts/first/nested/post should display:

Top 10 Interview Questions & Answers on Nextjs Dynamic Routes and URL Parameters

Top 10 Questions and Answers on Next.js Dynamic Routes and URL Parameters

Dynamic routes in Next.js allow you to create pages with routes that depend on external data. Instead of a static path like /about, a dynamic route might be something like /posts/[id]. These routes are defined by creating pages inside the pages directory using square brackets around a file or folder name ([param].js). When a request is made to such a route, Next.js provides the parameter data as a prop (params) to the component.

2. How do I create a dynamic route in Next.js?

To create a dynamic route in Next.js, simply add a page to your application within the pages folder and enclose the filename or folder name in square brackets to signify it as a dynamic parameter. For example, if you want to create a dynamic route for blog posts where each post can be identified by an ID, create a file at location pages/posts/[id].js. This file will automatically become dynamic and can handle requests like /posts/1, /posts/2, etc.

3. Can I use multiple parameters in a dynamic route?

Yes, you can definitely use multiple parameters in a dynamic route in Next.js. To include more than one parameter, nest additional folders or files within the dynamic route structure. Here's an example: pages/shop/[section]/[category]/[productID].js. If you visit /shop/electronics/mobiles/45678, Next.js will provide the parameters (section, category, productID) in the params object.

4. How can I pass URL parameters to a dynamic route in Next.js?

With Next.js, URL parameters are typically defined within the route itself using square brackets to specify which parts of the URL should be captured as parameters. However, if you're generating dynamic paths during server-side rendering (SSR) or static site generation (SSG), you'll need to provide them in the getStaticPaths or getServerSideProps functions. In your component, these parameters will be available through the router object or as props.

5. How do I access URL parameters in a dynamic Next.js page using the useRouter hook?

You can access URL parameters in any Next.js dynamic route by importing the useRouter hook from next/router. Once imported, you can call the hook in a functional component to get access to the router object, which contains a query property. Inside this property lies your URL parameters. For example, in pages/posts/[id].js, you can extract the id like so:

import { useRouter } from 'next/router'

const Post = () => {
  const router = useRouter()
  const { id } = router.query

  return (
    <div>
      <h1>Post ID: {id}</h1>
    </div>
  )
}

export default Post

6. Is there a difference between dynamic routes and query parameters?

Absolutely. Dynamic routes in Next.js refer to routes that have some part of their path dynamically set, e.g., /users/[userid]. These paths map directly to specific files in the pages folder. On the other hand, query parameters are optional key-value pairs appended to a URL after a question mark (e.g., /search?tag=news). They do not alter the pathname; instead, they provide additional information that can be accessed via the request object or via the router.query object.

7. How do I handle fallback in dynamic routes with getStaticPaths?

In Next.js, when you use getStaticPaths for SSG, you must define all possible paths at build time. When a user navigates to a path that hasn't been pre-rendered, they will initially see a fallback view (which could be either a loading page or a complete page rendered on the server side). After rendering, subsequent visits to the same path will display the pre-rendered page. To enable fallback rendering, return an object from getStaticPaths with the fallback key set to true:

export async function getStaticPaths() {
  // Call an external API endpoint to get posts
  const res = await fetch('https://api.example.com/posts')
  const posts = await res.json()

  // Get the paths we want to pre-render based on posts
  const paths = posts.map((post) => ({
    params: { id: post.id },
  }))

  // We'll pre-render only these paths at build time.
  // { fallback: true } means other routes should 404.
  return { paths, fallback: true }
}

8. How can I redirect from a dynamic route in Next.js?

In Next.js, the redirect option in a getServerSideProps function is used to redirect the user to another page. Since dynamic routes involve server-side rendering functions, using redirects within these functions is straightforward. Here’s an example of how you might redirect based on a parameter:

export async function getServerSideProps(context) {
  const { slug } = context.params;
  
  // Perform redirection logic here
  if(slug === 'old-post'){
    return {
      redirect: {
        destination: '/new-location',
        permanent: true,
      }
    };
  }

  return { props: {} };
}

9. Are dynamic routes compatible with both SSR and SSG?

Absolutely! Next.js allows you to use dynamic routes with server-side rendering using getServerSideProps and with static site generation using getStaticPaths and getStaticProps. This flexibility means you can optimize performance for both server-rendered and statically-generated pages depending on your application requirements.

10. How do dynamic routes work in development mode versus production mode?

*During development, dynamic routing in Next.js works seamlessly due to its development server capabilities, allowing it to render the correct component whenever a request matches a dynamic path pattern even if the exact path has not been pre-generated during the initial build phase.

In production, however, dynamic routes need to be pre-rendered, either completely at build time with getStaticPaths in SSG projects or on-demand when needed using fallback behavior. Next.js builds each individual path returned by getStaticPaths, while fallback routes will either return a 404 page (if fallback is false) or render the page on the server for the first visitor (if fallback is true or 'blocking'). For paths added later, after deployment in an SSG scenario with fallback enabled, a new build would be required to statically generate these pages.*

You May Like This Related .NET Topic

Login to post a comment.