
- Next.js - Home
- Next.js - Overview
- Next.js - Project Setup
- Next.js - Folder Structure
- Next.js - App Router
- Next.js - Page Router
- Next.js Features
- Next.js - Pages
- Next.js - Data Fetching
- Next.js - ISR
- Next.js - Static File Serving
- Next.js - Pre-Rendering
- Next.js - Partial Pre Rendering
- Next.js - Server Side Rendering
- Next.js - Client Side Rendering
- Next.js Routing
- Next.js - Routing
- Next.js - Nested Routing
- Next.js - Dynamic Routing
- Next.js - Parallel Routing
- Next.js - Imperative Routing
- Next.js - Shallow Routing
- Next.js - Intercepting Routes
- Next.js - Redirecting Routes
- Next.js - Navigation and Linking
- Next.js Configuration
- Next.js - TypeScript
- Next.js - Environment Variables
- Next.js - File Conventions
- Next.js - ESLint
- Next.js API & Backend
- Next.js - API Routes
- Next.js - Dynamic API Routes
- Next.js - Route Handlers
- Next.js - API MiddleWares
- Next.js - Response Helpers
- Next.js API Reference
- Next.js - CLI Commands
- Next.js - Functions
- Next.js - Directives
- Next.js - Components
- Next.js - Image Component
- Next.js - Font Component
- Next.js - Head Component
- Next.js - Form Component
- Next.js - Link Component
- Next.js - Script Component
- Next.js Styling & SEO
- Next.js - CSS Support
- Next.js - Global CSS Support
- Next.js - Meta Data
- Next.js Advanced Topics
- Next.js - Error Handling
- Next.js - Server Actions
- Next.js - Fast Refresh
- Next.js - Internationalization
- Next.js - Authentication
- Next.js - Session Management
- Next.js - Authorization
- Next.js - Caching
- Next.js - Data Caching
- Next.js - Router Caching
- Next.js - Full Route Caching
- Next.js - Request Memoization
- Next.js Performance Optimization
- Next.js - Optimizations
- Next.js - Image Optimization
- Next.js - Lazy Loading
- Next.js - Font Optimization
- Next.js - Video Optimization
- Next.js - Script Optimization
- Next.js - Memory Optimization
- Next.js - Using OpenTelemetry
- Next.js - Package Bundling Optimization
- Next.js Testing
- Next.js - Testing
- Next.js - Testing with Jest
- Next.js - Testing with Cypress
- Next.js - Testing with Vitest
- Next.js - Testing with Playwright
- Next.js Debugging & Deployment
- Next.js - Debugging
- Next.js - Deployment
- Next.js Useful Resources
- Next.js - Interview Questions
- Next.js - Quick Guide
- Next.js - Useful Resources
- Next.js - Discussion
Next.js - Shallow Routing
In Next.js, shallow routing is a navigation technique that allows you to change the URL of a page, without reloading the page. In this chapter, we will learn what is shallow routing, how to implement it and benefits of using it.
What is Shallow Routing?
Shallow routing is a routing method in Next.js in which the URL update occur without re-rendering or reloading the entire page. This method avoid re-executing of data fetching methods like getServerSideProps, getStaticProps, and getInitialProps. It provides a way to modify the URL and route state without losing the current page's context or performance.
Implementing Shallow Routing
Next.js provides the useRouter hook to implement shallow routing. To enable shallow routing, set the shallow option to true inside object of useRouter. See the example below.
Example
In the following example, we created a button which on clicked counts of steps are increased and it will be updated in URL.
'use client'; import { useRouter } from 'next/navigation'; import { useState, useEffect } from 'react'; export default function ShallowRoutingExample() { const router = useRouter(); const [step, setStep] = useState(1); const handleRouteChange = () => { const nextStep = step + 1; setStep(nextStep); // Update local state // Update the URL without reloading the page router.push(`/shallow-routing?step=${nextStep}`,{ shallow: true }); }; return ( <div> <h1>Shallow Routing Example</h1> <p> Current step: <strong>{step}</strong> </p> <button onClick={handleRouteChange} > Next Step </button> </div> ); }
Output
In the output, the count of steps is changing on URL.

Benefits of Shallow Routing
Shallow routing offers several advantages:
- Maintains current page state during URL updates
- Prevents unnecessary data refetching
- Improves performance by avoiding full page reloads
- Enables dynamic URL modifications without disrupting user experience