Aymen Jdily
Routing forms the backbone of any web application, enabling users to navigate seamlessly between pages. With Next.js, routing is straightforward, thanks to its file-based routing system. But when building dynamic apps like blogs, e-commerce sites, or dashboards, dynamic routes become essential. This guide walks you through the basics and advanced techniques of dynamic routing in Next.js.
Dynamic routes let you create pages based on dynamic data such as user IDs, product slugs, or any variable. Instead of hardcoding routes like /blog/post-1, you can define a dynamic route, /blog/[slug], that adapts to any slug passed in the URL.
In pages/blog/[slug].js, use the useRouter hook to access the route parameter:
1import { useRouter } from 'next/router';
2
3const BlogPost = () => {
4 const router = useRouter();
5 const { slug } = router.query;
6
7 return <h1>Blog Post: {slug}</h1>;
8};
9
10export default BlogPost;
Run your development server (npm run dev) and visit /blog/my-first-post. You should see:
Blog Post: my-first-post
Dynamic routes shine when paired with real data. Use getStaticPaths and getStaticProps for Static Site Generation (SSG) or getServerSideProps for Server-Side Rendering (SSR).
Define Routes with getStaticPaths:
1export async function getStaticPaths() {
2 const paths = [
3 { params: { slug: 'my-first-post' } },
4 { params: { slug: 'nextjs-guide' } },
5 ];
6 return { paths, fallback: false }; // Fallback can also be true or blocking
7}
Fetch Data with getStaticProps:
1export async function getStaticProps({ params }) {
2 const post = await fetch(`https://api.example.com/posts/${params.slug}`)
3 .then((res) => res.json());
4
5 return { props: { post } };
6}
1const BlogPost = ({ post }) => {
2 return (
3 <div>
4 <h1>{post.title}</h1>
5 <p>{post.content}</p>
6 </div>
7 );
8};
9
10export default BlogPost;
Catch-all routes ([...slug].js) handle multiple segments dynamically. For instance, a route like /blog/2024/01/my-post can be captured with:
1const BlogPost = () => {
2 const router = useRouter();
3 const { slug } = router.query;
4
5 return <h1>Path: {slug?.join('/')}</h1>;
6};
7
8export default BlogPost;
To generate paths for catch-all routes, update getStaticPaths:
1export async function getStaticPaths() {
2 const paths = [
3 { params: { slug: ['2024', '01', 'my-post'] } },
4 { params: { slug: ['2024', '02', 'another-post'] } },
5 ];
6
7 return { paths, fallback: false };
8}
SEO Optimization: Use descriptive slugs, e.g., /blog/nextjs-tips instead of /blog/123.
Fallback Pages: Use fallback: true or blocking to load new routes dynamically without rebuilding.
404 Handling: Create a custom 404.js page in the pages directory for invalid routes.
Prefetch Links: Use next/link to prefetch data for linked pages and improve navigation speed.
Example:
1import Link from 'next/link';
2
3const BlogList = ({ posts }) => (
4 <div>
5 {posts.map((post) => (
6 <Link key={post.slug} href={`/blog/${post.slug}`}>
7 <a>{post.title}</a>
8 </Link>
9 ))}
10 </div>
11);
Dynamic routing is a cornerstone of scalable web applications. By leveraging Next.js features like getStaticPaths and getStaticProps, you can create fast, SEO-friendly pages that cater to diverse data-driven needs. Whether you're building a blog, an e-commerce site, or a dashboard, mastering dynamic routing is essential.
Happy coding! 🚀