Redux 中的 React Router 路由参数
2016-11-02
3694
使用 redux 和 react router,我想访问除路由指定的组件之外的组件上的路由参数。
我已经设置了 react-router、redux 和 react-router-redux,如下所示,我想从我的 redux 存储中访问 reportId 参数。
const history = syncHistoryWithStore(browserHistory, store);
const store = createStore(reducers);
const routes = (
<Router history={history}>
<Route path="/" component={MainLayout} >
<IndexRoute component={Home} />
<Route path="reports">
<Route path=":reportId" component={ReportViewerContainer} />
</Route>
</Route>
</Router>
);
ReactDOM.render(
<Provider store={store}>{router}</Provider>,
document.getElementById('root')
);
我尝试连接 react-redux-router 来存储路由状态,但我发现除了活动路由的完整路径之外,redux 内部没有存储任何有用的东西。这让我只能选择从 redux 中的路径中解析出 reportId,或者在 redux 中创建我自己的自定义操作并使用我的 ReportViewerContainer 组件内的 componentWillReceiveProps 生命周期方法对其进行更新。一定有更好的方法吗?
3个回答
如果你想要访问组件内部的路由器参数,最好的方法是使用 withRouter
通过上面的例子你会发现更好的理解。
Kishore Chandra
2016-11-02
如果您想访问 redux 存储中的路由器,有一个名为
withRouter
的 HOC(
docs
)。如果我没记错的话,这会将任何路由器状态作为 props 传递给您的组件。
您需要对组件进行的唯一更改是:
import { withRouter } from 'react-router'
export default withRouter(ReportViewerContainer);
Pavlin
2016-11-02
因此,我认为您可以使用 context 来获取将通过路由器传递的位置。 (请参阅该链接了解其工作原理。)这应该会给您一个坚实的工作方向。
这也可以帮助您顺利开展 国际化 工作。
class MyComponent extends React.Component {
static contextTypes = {
router: React.PropTypes.object
};
render(){
// By declaring context type here, and childContextTypes
// on the parent along with a function with how to get it,
// React will traverse up and look for the `router` context.
// It will then inject it into `this.context`, making it
// available here.
}
}
Nevin
2016-11-02