Route Params
Dynamic URL segments identify resources — user IDs, product slugs, tab names. React Router exposes path params via useParams() and query strings via useSearchParams().
Path Parameters
Define dynamic segments with :paramName in the route path. useParams() returns an object of current param values as strings.
Search params (?sort=price&page=2) are ideal for filters, pagination, and shareable UI state that is not part of the resource identity.
// Route: /products/:productId
function ProductPage() {
const { productId } = useParams();
const { data } = useQuery({
queryKey: ['product', productId],
queryFn: () => fetchProduct(productId),
});
return <ProductDetail product={data} />;
}
Always validate and parse params — they are untrusted strings from the URL.
Params vs Search Params
const { id } = useParams(); // /users/42
const [search, setSearch] = useSearchParams(); // ?tab=settings
const tab = search.get('tab');
- Params identify resources; search params modify view/filter.
- All param values are strings — parse numbers explicitly.
setSearchParams updates query string and re-renders. - Use
generatePath to build URLs from patterns safely.
URL State Reference
Hooks for reading URL data.
| Hook | Reads |
useParams() | Path params (:id) |
useSearchParams() | Query string (?key=val) |
useLocation() | Full location object |
useMatch() | Specific route match info |
generatePath() | Build path from pattern |
Navigate | Redirect with replace state |
Validating Route Params
Validate params before API calls. Invalid IDs should show 404 or error UI, not crash the app.
const { id } = useParams();
const productId = Number(id);
if (Number.isNaN(productId)) return <NotFound />;
URL as UI State
Storing filters, sort order, and pagination in search params makes views bookmarkable and shareable — prefer URL over local state for these concerns.
Common Mistakes
- Assuming params are numbers without parsing.
- Storing sensitive tokens in URL search params.
- Not encoding special characters in query values.
- Mixing param names between route definition and useParams.
Key Takeaways
useParams() reads dynamic path segments. useSearchParams() manages query string state. - Parse and validate param strings from URLs.
- Use search params for filters and pagination.
Pro Tip
Libraries like nuqs or RR's setSearchParams make typed query state easier in TypeScript apps.