最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Is there a way to expose route params outside <Route> component? - Stack Overflow

programmeradmin0浏览0评论

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!

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!

Share Improve this question asked Jun 27, 2017 at 14:22 gl0gl0gl0gl0 2751 gold badge3 silver badges7 bronze badges
Add a comment  | 

3 Answers 3

Reset to default 8

Edit: You can use https://v5.reactrouter.com/web/api/Hooks/useroutematch directly these days.

Original Answer

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.

You can just wrap that component with it's own Route component like this:

...  
<Route path="/cameras/:camera/">
  <CameraName />
</Route>
...

// this is so the camera name can be fetched from the route.
const CameraName = () => {
  let { camera } = useParams();
  return <div>{camera}</div>;
};
发布评论

评论列表(0)

  1. 暂无评论