有没有办法在 <Route> 组件之外公开路由参数?
Is there a way to expose route params outside <Route> component?
如果我有这样的东西:
<ConnectedRouter history={history}>
<App />
</ConnectedRouter>
我的路线配置如下:
export default [{
path: '/',
exact: true,
main: Home
},
{
path: '/:someId',
exact: true,
main: Profile
},
{
path: '*',
main: NotFound
}];
其中应用程序只是路由和其他组件的包装器,例如:
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>
);
}
}
有没有办法让 AnotherComponent 使用 match.params 或公开它们?我已经尝试用 withRouter 包装组件,并将其添加为没有匹配路径的路由,如:
<Route component={AnotherComponent} />
当路由为 /:someId 时,它会同时呈现 Profile 和 AnotherComponent,但是 match.params AnotherComponent 是空的 :/.
这可能吗?
谢谢!
React router 只会 return params 如果你在 Route 上有路径。您可以从顶层传递参数。让该组件在其中呈现。它将有权访问参数。至于任何其他时间,您需要做的是:
<Route path="/:someId" component={AnotherComponent} />
如果你想让它真正得到那个参数!
只有 Route
组件下的 children 可以访问参数。您应该以只有该路由内的组件需要其参数的方式构建您的应用程序。
编辑:这些天你可以直接使用https://v5.reactrouter.com/web/api/Hooks/useroutematch。
原答案
您可以使用matchPath
import { matchPath } from 'react-router'
import { useLocation } from 'react-router-dom'
//----
const { pathname } = useLocation()
const params = matchPath(pathname, { path:"/:someId" })
//----
您可以像这样用它自己的 Route 组件包装该组件:
...
<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>;
};
如果我有这样的东西:
<ConnectedRouter history={history}>
<App />
</ConnectedRouter>
我的路线配置如下:
export default [{
path: '/',
exact: true,
main: Home
},
{
path: '/:someId',
exact: true,
main: Profile
},
{
path: '*',
main: NotFound
}];
其中应用程序只是路由和其他组件的包装器,例如:
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>
);
}
}
有没有办法让 AnotherComponent 使用 match.params 或公开它们?我已经尝试用 withRouter 包装组件,并将其添加为没有匹配路径的路由,如:
<Route component={AnotherComponent} />
当路由为 /:someId 时,它会同时呈现 Profile 和 AnotherComponent,但是 match.params AnotherComponent 是空的 :/.
这可能吗? 谢谢!
React router 只会 return params 如果你在 Route 上有路径。您可以从顶层传递参数。让该组件在其中呈现。它将有权访问参数。至于任何其他时间,您需要做的是:
<Route path="/:someId" component={AnotherComponent} />
如果你想让它真正得到那个参数!
只有 Route
组件下的 children 可以访问参数。您应该以只有该路由内的组件需要其参数的方式构建您的应用程序。
编辑:这些天你可以直接使用https://v5.reactrouter.com/web/api/Hooks/useroutematch。
原答案
您可以使用matchPath
import { matchPath } from 'react-router'
import { useLocation } from 'react-router-dom'
//----
const { pathname } = useLocation()
const params = matchPath(pathname, { path:"/:someId" })
//----
您可以像这样用它自己的 Route 组件包装该组件:
...
<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>;
};