以编程方式导航使用反应路由器
我正在开发一个应用程序,我检查用户是否没有loggedin
我必须显示登录表单,否则发送一个动作,将改变路线和加载其他组件。这里是我的代码:
render() { if (isLoggedIn) { // dispatch an action to change the route } // return login component <Login /> }
我怎么能做到这一点,因为我不能改变渲染功能的状态。
考虑到你正在使用react-router v4
与withRouter
一起使用你的组件,并使用withRouter
history.push
改变路由。 只有当你的组件没有收到Router
道具时,你才需要使用withRouter
,当你的组件是一个由路由器渲染的组件的嵌套子withRouter
,并且你没有通过路由器道具的时候,该组件根本不链接到路由器,并且作为路由的单独组件呈现。
import {withRouter} from 'react-router'; class App extends React.Component { ... render() { if (isLoggedIn) { // dispatch an action to change the route this.props.history.push('/home'); } // return login component return <Login /> } } export default withRouter(App);
重要的提示
如果使用
withRouter
来防止更新被shouldComponentUpdate
阻塞,那么withRouter
包装实现shouldComponentUpdate
的组件是非常重要的。 例如,使用Redux时:/ /这绕过
shouldComponentUpdate
withRouter(connect(...)(MyComponent))
//这不是
connect(...)(withRouter(MyComponent))
使用react-router v2 or react-router v3
,您可以利用context
来动态更改路由
class App extends React.Component { ... render() { if (isLoggedIn) { // dispatch an action to change the route this.context.router.push('/home'); } // return login component return <Login /> } } App.contextTypes = { router: React.PropTypes.object.isRequired } export default App;
或使用
import { browserHistory } from 'react-router'; browserHistory.push('/some/path');
在反应路由器版本4中:
import React from 'react' import { BrowserRouter as Router, Route, Redirect} from 'react-router-dom' const Example = () => ( if (isLoggedIn) { <OtherComponent /> } else { <Router> <Redirect push to="/login" /> <Route path="/login" component={Login}/> </Router> } ) const Login = () => ( <h1>Form Components</h1> ... ) export default Example;