When to Avoid useParams Hook in React
The useParams hook from React Router is a popular tool
for accessing dynamic values from the current URL. However, relying on
it too heavily can lead to brittle component architecture, testing
difficulties, and poor code reusability. This article explores the
specific scenarios where you should avoid using the
useParams hook and what alternatives you should use instead
to keep your React codebase clean and maintainable.
1. When Building Reusable UI Components
If you are building a generic component—such as a product card, a
user profile card, or a reusable table—you should avoid using
useParams inside it.
When a component calls useParams, it becomes tightly
coupled to the router and a specific URL structure. If you try to render
that component on a different page with a different route structure, it
will fail to get the data it needs.
The Solution: Pass the required data or the ID down to the component via standard React props. This keeps the component pure, highly reusable, and easy to test.
2. Deeply Nested Child Components
It is tempting to call useParams in deeply nested child
components to avoid “prop drilling.” However, doing this couples your
entire component tree to the routing context. It also makes unit testing
these sub-components significantly harder, as you will have to mock the
router wrapper for every single test.
The Solution: Retrieve the route parameters at the top-level page component (the route layout or page container). From there, pass the values down as props, or use React Context if the data needs to be accessed by many distant descendants.
3. Handling UI-Only State (Filters, Search, and Toggles)
Path parameters (which useParams reads) are meant for
identifying specific resources, like /users/:id or
/posts/:slug. You should avoid using path parameters for
temporary UI states, such as: * Search queries * Sorting options *
Active filters * Sidebar toggle states
Using path parameters for these actions clutters the URL path structure and makes routing logic overly complex.
The Solution: Use standard React state
(useState) for local UI changes. If the state needs to be
shareable via a link (like search results or filters), use query
parameters (e.g., ?search=react&sort=asc) and read them
using the useSearchParams hook instead of
useParams.
4. Handling Sensitive Data or Complex Objects
Path parameters are visible in the browser history, server logs, and
analytics tools. You should never pass sensitive information like email
addresses, passwords, or authentication tokens through route parameters.
Additionally, attempting to serialize complex data objects into a URL
string to read with useParams is an anti-pattern that leads
to fragile, hard-to-decode URLs.
The Solution: Use secure state management tools,
context, or React Router’s state state-passing mechanism (via the
Link component’s state prop) to pass complex,
non-sensitive data between routes. Sensitive data should always be
managed securely through state, HTTP cookies, or API headers.