react-router4.2使用js控制路由跳轉的3種方式

1、背景

  • 在不少狀況下,咱們須要用js來控制頁面的路由切換,而不是經過Link標籤這種方式,好比有這樣一個場景,用戶要登錄一個網站才能看到網站裏面的內容,登陸接口是一個獨立的子頁面,登錄成功後,才能進入網站瀏覽相關內容,使用react作SPA時就須要作路由的切換。

2、react-router4.2

  • 在網上隨處可見react-router入門使用方式,經過連接綁定組件實現跳轉,或者綁定hashHistory後,妄想在子組件中使用this.props.history.push('/某路徑')實現路由跳轉,誠然,在之前的版本是可行的,聽說,反正我沒用過。而奇葩的4.2版本並不支持這種方式。我在網上看了許久,試了諸多辦法,任然沒法經過上述方式實現js控制路由切換,emmm...

3、問題解決辦法

使用4.2裏面的Redirect標籤?組件?,不知道怎麼稱呼
具體以下:
先定義路由(表):
import {
  BrowserRouter as Router,
  Route,
  Switch
} from 'react-router-dom';
 <Router >
      <div style={{height:'100%'}}>
      <Switch>
        <Route exact path="/" component={LoginPage}/>
        <Route path="/chat" component={Chat}/>
        <Route path="/home" component={Home}/>
        <Route path="/login" component={Login}/>
      </Switch>
      </div>
    </Router>)

方法1、在子組件裏使用
先要引入Redirectreact

import { Redirect } from 'react-router';

 class Login extends React.Component {
    
    render() {
    const {isRegisterNewUser,loginSuccess}=this.props;
    const { getFieldDecorator} = this.props.form;
    if(loginSuccess){
      *return (<Redirect to="/chat" />);*
    }else{
     return(
     這裏放沒登錄以前的各類form表單
     )
    } 
    
  }
}

方法2、來自下面的大佬:靜對94
import PropTypes from 'prop-types';web

static contextTypes = {

    router: PropTypes.object.isRequired,
}

console.log(this.context.router)

例如:redux

class Login extends React.Component {
        static contextTypes = {
            router: PropTypes.object.isRequired,
        }
        render() {
        const {isRegisterNewUser,loginSuccess}=this.props;
        const { getFieldDecorator} = this.props.form;
        if(loginSuccess){//登錄狀態變爲成功
          this.context.router.history.push('/chat)
        }else{
         return(
         這裏放沒登錄以前的各類form表單
         )
        } 
        
      }
    }

方法3、來自Inori_Lover 大佬推薦的官方文檔:使用withRouter解決segmentfault

import {withRouter } from 'react-router';
class Login extends React.Component {
            static contextTypes = {
                router: PropTypes.object.isRequired,
            }
            render() {
            const {isRegisterNewUser,loginSuccess,history}=this.props;
            const { getFieldDecorator} = this.props.form;
            if(loginSuccess){//登錄狀態變爲成功
              this.props.history.push('/chat)
            }else{
             return(
             這裏放沒登錄以前的各類form表單
             )
            } 
            
          }
        }
        ...
        
const Login=withRouter(connect(mapStateToProps,mapDispatchToProps)(TLogin))
export default Login;

若是你沒有使用redux,那麼你使用withRouter的正確姿式應該是api

const Login=withRouter(TLogin)
export default Login;

4、重點就是:

感謝各位大佬的指點,是我太浮躁,沒認真閱讀文檔,之後必定多看。無論什麼方式,解決問題纔是最重要的。react-router

參考鏈接:stackoverflowdom

相關文章
相關標籤/搜索