If I have something like this:
<ConnectedRouter history={history}>
<App />
</ConnectedRouter>
My routes config looks like:
export default [{
path: '/',
exact: true,
main: Home
},
{
path: '/:someId',
exact: true,
main: Profile
},
{
path: '*',
main: NotFound
}];
Where app is just a wrapper of the routes and other components like:
class App extends Component {
render() {
return (
<div>
<Header />
<Switch>
{routes.map((route, i) => <Route exact key={i} component={route.main} path={route.path}/>)}
</Switch>
<AnotherComponent {...this.props} />
</div>
);
}
}
Is there a way for AnotherComponent to use match.params or to expose those? I already tried wrapping the component with withRouter and also adding it as a Route with no path to match like:
<Route component={AnotherComponent} />
And when the route is /:someId it does render both Profile and AnotherComponent, but match.params for AnotherComponent are empty :/.
Is this possible? Thanks!
render: funcInstead of having a new React element created for you using the component prop, you can pass in a function to be called when the location matches. The render prop function has access to all the same route props (match, location and history) as the component render prop.
render makes the component mount just once, then re-render when required. The component stays in the background — this means that anything you put in componentDidMount , constructor , or, for example, shouldComponentUpdate , will run only once!
When using React Router v5, it was possible to get the path (pattern) for that route using useRouteMatch . const { path } = useRouteMatch(); React Router v6 offers a similar hook, useMatch ; however this expects to receive the pattern you want to match against.
Edit: You can use https://v5.reactrouter.com/web/api/Hooks/useroutematch directly these days.
You can use matchPath
import { matchPath } from 'react-router'
import { useLocation } from 'react-router-dom'
//----
const { pathname } = useLocation()
const params = matchPath(pathname, { path:"/:someId" })
//----
React router will only return params if you have a path on the Route. You can pass down the params from your top level . Have that component render inside of it. It will have access to the params. As for any other time, you need to be doing:
<Route path="/:someId" component={AnotherComponent} />
If you want it to actually get that param!
Only children underneath the Route
component can access the params. You should be building your app in such a way that only the component inside that route needs its params.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With