In React Router v6, I'm trying to create a dynamic SubHeader component that changes based on a particular route or route param. For context, here's a contrived setup:
export const App = () => {
return (
<BrowserRouter>
<Header>
<TopHeader />
<DynamicSubHeader /> // <-- here
</Header>
<Routes>
<Route path="products" element={<Products />} />
<Route path='product/:id/*' element={<ProductDetail />} >
<Route path="price" element={<ProductDetailPrice />} />
</Route>
</Routes>
</BrowserRouter>
)
}
I'd like to update <DynamicSubHeader />
with different content when navigating between /products
, /products/:id
and even /products/:id/price
Inside <DynamicSubHeader />
, I've tried to use the useParam hook provided by react-router-dom
, but it just returns null or the data doesn't persist. It seems you can only use useParam when it's nested inside the <Routes>
component.
I've also tried using the useLocation hook to listen for route change and manually setting state there, but it doesn't persist either.
For the time being, I've treated <Header />
as a Layout-component that I've placed in each route. Am I using React Router wrong? Otherwise, any suggestions on how to approach this?