如何使用 React Router 修改作为 props 发送的路由参数?
How do I modify the route parameters sent as props with React Router?
我有一个 React Router
,路由如下:
<Router history={history}>
<Route path='/' component={App} />
<Route path='/:fileType/:fileId' component={App} />
</Router>
这会将道具放入我的 App
中,如下所示:
{
fileType: 'whatever',
fileId: 'ABC5734'
}
但是,我设计了我的组件,因此它需要这种格式:
{
file: {
type: 'whatever',
id: 'ABC5734'
}
}
因此,我想在将路径道具发送到组件之前对其进行转换。像这样:
<Router history={history}>
<Route path='/' component={App} />
<Route
path='/:fileType/:fileId'
component={(props) => <App file={{type: props.fileType, id: props.fileId}} />} />
</Router>
这可能吗?
您应该使用高阶组件。
您可以使用 mapProps
Higher-order Component from recompose
:
import mapProps from 'recompose/mapProps'
<Router history={history}>
<Route path='/' component={App} />
<Route
path='/:fileType/:fileId'
component={mapProps(({ params: { fileType, fileId } }) => ({
fileType,
fileId
}))(App)}/>
</Router>
React-router 在 this.props.params
下发送路由参数。因此,更正您的代码。
<Router history={history}>
<Route path='/' component={App} />
<Route
path='/:fileType/:fileId'
component={(props) => <App file={{type: props.params.fileType, id: props.params.fileId}} />} />
</Router>
我有一个 React Router
,路由如下:
<Router history={history}>
<Route path='/' component={App} />
<Route path='/:fileType/:fileId' component={App} />
</Router>
这会将道具放入我的 App
中,如下所示:
{
fileType: 'whatever',
fileId: 'ABC5734'
}
但是,我设计了我的组件,因此它需要这种格式:
{
file: {
type: 'whatever',
id: 'ABC5734'
}
}
因此,我想在将路径道具发送到组件之前对其进行转换。像这样:
<Router history={history}>
<Route path='/' component={App} />
<Route
path='/:fileType/:fileId'
component={(props) => <App file={{type: props.fileType, id: props.fileId}} />} />
</Router>
这可能吗?
您应该使用高阶组件。
您可以使用 mapProps
Higher-order Component from recompose
:
import mapProps from 'recompose/mapProps'
<Router history={history}>
<Route path='/' component={App} />
<Route
path='/:fileType/:fileId'
component={mapProps(({ params: { fileType, fileId } }) => ({
fileType,
fileId
}))(App)}/>
</Router>
React-router 在 this.props.params
下发送路由参数。因此,更正您的代码。
<Router history={history}>
<Route path='/' component={App} />
<Route
path='/:fileType/:fileId'
component={(props) => <App file={{type: props.params.fileType, id: props.params.fileId}} />} />
</Router>