Fetching Route Params & Query Params in modern Next.js (App Router) + use() hook.
In modern Next.js (App Router), URL data is accessed in two primary ways: Route Params (dynamic segments like /user/123) and Query Params (search strings like ?page=2).
Dynamic segments in the URL path.
👉 shivam = route param
Search strings following the ? symbol.
👉 category = query param
👉 [username] → dynamic segment
| Feature | params | searchParams |
|---|---|---|
| Source | URL path | Query string |
| Example | /user/123 | ?page=2 |
| Async | Yes | Yes |
In newer Next.js versions, params can behave like a Promise. You must await them or unwrap them.
Async Version (Recommended)
export default async function Page({ params }) {
const { username } = await params;
return <div>{username}</div>;
}SearchParams follow the same async pattern in Server Components.
export default async function Page({ searchParams }) {
const { category } = await searchParams;
return <div>Category: {category}</div>;
}use() is a React hook that unwraps Promises directly inside components.
import { use } from "react";
export default function Page({ params }) {
// Directly unwrap params promise
const { username } = use(params);
return <div>{username}</div>;
}import { use } from "react";
function getData() {
return fetch("https://api").then(res => res.json());
}
export default function Page() {
const data = use(getData());
return <div>{data.name}</div>;
}"use client";
import { useParams } from "next/navigation";
export default function Page() {
const params = useParams();
return <div>{params.username}</div>;
}"use client";
import { useSearchParams } from "next/navigation";
export default function Page() {
const searchParams = useSearchParams();
return <div>{searchParams.get("category")}</div>;
}| Feature | Server | Client |
|---|---|---|
| Route params | params | useParams() |
| Query params | searchParams | useSearchParams() |
| Async support | Yes | No |
| Performance | Better | Moderate |
Enabling Modern Framework Features
By making params async, Next.js can begin rendering parts of your page before the URL segments are even fully processed.
Server
RESOLVE → HTML
✔ Faster + SEO
Client
JS LOAD → RESOLVE
❌ Slower initial
Using useParams() in Server Components (it's a hook!).
Not awaiting params in Next.js 15+ Server Components.
Using use() when a simple await is cleaner.
Forgetting to handle URL decoding (decodeURIComponent).
Next.js URLs are the single source of truth for both resource identity and view state.
Identity + State + Performance