一個簡單的react路由攔截


不同於vue,通過在路由里設置meta元字符實現路由攔截。react實現路由攔截的基本思路還是利用Route 的render函數。通過判斷攔截條件(比如sessionID是否存在)來實現不同的組件的跳轉,從而實習攔截。

接下來,我們實現一個簡單的實例了解路由攔截的基本流程。

頁面初次渲染的時候,需要我們進行登錄。在這個首屏的頁面里,我們放入一個鏈接。當點擊鏈接,我們想進入我們的布局頁面,(實際項目中是我們的后台)。但是布局頁面是不允許我們隨意進入的。如果沒有登錄(真實項目中我們以sessionid作為是否登錄過的條件),那么頁面會強制進入登錄頁面。否則進入我們的布局頁面(實際項目中的后台)

我們這里寫幾個基本的組件,作為上述條件對應的組件:

login.js   -------->登錄頁面

Layout.js -------->布局頁面(實際項目中的后台)

author   --------->授權組件 (作為攔截組件,攔截的條件寫在這個組件中)

isLogin  ---------->判斷是否登錄過的條件  (實際項目中的sessionID)

這個實例我們需要一個判斷條件。也就是isLogin,我們結合狀態管理工具,(本實例中的狀態管理工具選用mobx),isLogin==true,表示我們我們可以訪問該組件。否則表示我們無權訪問該組件。

 

--------------------------------------------------------------------------------------------

 1 index.js文件(入口文件)
 2 
 3 import registerServiceWorker from './registerServiceWorker';
 4 import {Provider} from "mobx-react";
 5 import {observable} from "mobx";
 6 import {BrowserRouter,Switch,Route} from "react-router-dom";
 7 import Login from "./components/login/Login.js"
 8 import AuthorizedRoute from "./components/author/author.js"
 9 import Layout from "./components/Layout.js"
10 
11 class Store{
12  @observable isLogin=false;   
13 }
14 const store=new Store()
15 
16 ReactDOM.render(
17     <Provider store={store}>
18          <BrowserRouter>
19          <div>
20              <Switch>
21              <Route path="/" exact component={Login} />
22              <Route path="/login" component={Login} />
23              <AuthorizedRoute path="/author" component={Layout} />
24              </Switch>
25          </div>
26          </BrowserRouter>
27     </Provider>
28     , document.getElementById('root'));
29 
30 registerServiceWorker();

 

-----------------------------------------------------------------------------------------

 1 author.js(主要內容是導出一個授權的組件。該組件內處理攔截邏輯)
 2 
 3 import React, { Component } from 'react';
 4 
 5 import {Redirect,Route}from "react-router-dom";
 6 import Login from "../login/Login.js"
 7 import {observer,inject} from "mobx-react";
 8 @inject("store") 
 9 @observer class AuthorizedRoute extends Component{
10   render(){
11        console.log("author里的store:",this.props.store)
12        let { component: Component,...rest} =this.props; //獲取頂層provider上所有的信息
13        let {isLogin}=this.props.store;
14       console.log("isLogin:",isLogin)
15     console.log("this.props:",this.props)
16     return(
17             <Route {...rest} render={props=>{
18                return isLogin?<Component {...this.props} />:<Redirect to="/Login" /> //這里的<Component {...this.props} />實際上指向的是Layout組件
19             }}/>
20         )
21   }
22 }
23 export default AuthorizedRoute

 

-----------------------------------------------------------------------------------

 1 login.js(登錄組件)
 2 
 3 import React, { Component } from 'react';
 4 
 5 import{Link} from "react-router-dom"
 6 class Login extends Component{
 7   render(){
 8     return(
 9                <div>
10                          <p>請輸入賬戶:<input type="text" /></p>
11                          <p>請輸入密碼:<input type="password" /></p>
12                          <hr />
13                          <Link to='/author'>進入main組件</Link>
14                </div>
15         )
16   }
17 }
18 export default Login

 

------------------------------------------------------------------------------------

 1 Layout.js (布局組件)
 2 
 3 import React, { Component } from 'react';
 4 
 5 class Layout extends Component{
 6   render(){
 7     return(
 8                <div>
 9                     <div>
10                         <ul>
11                             <li>1111</li>
12                             <li>2222</li>
13                             <li>33333</li>
14                         </ul>
15                     </div>
16                     <div>
17                          <p>wenben1</p>
18                          <p>wenben1</p>
19                          <p>wenben1</p>
20                          <p>wenben1</p>
21                     </div>
22                </div>
23         )
24   }
25 }
26 
27 export default Layout
28 這里我們對layout組件進行了攔截,如果還有其他的頁面也需要進行攔截,我們也可以在index.js中多添加一個授權組件。把它的component指向該組件,比如我們還有一個home頁面也需要判斷。那么我們可以做如下修改:
29 
30    <Provider store={store}>
31          <BrowserRouter>
32          <div>
33              <Switch>
34              <Route path="/" exact component={Login} />
35              <Route path="/login" component={Login} />
36              <AuthorizedRoute path="/author" component={Layout} />
37              <AuthorizedRoute path="/home" component={Home} />
38              </Switch>
39          </div>
40          </BrowserRouter>
41     </Provider>

 

 

這個實例中我們用的是mobx作為狀態管理工具,在全局定義了一個isLogin,我們也可以利用redux實現同樣的功能,真實項目中一般我們會在登錄以后通過訪問后台返回的sessionID來進行判斷。登錄成功以后我們把sessionID存入sessionStorage中,在授權組件(本例中的AuthorizedRoute)先在本地取出sessionID,再通過它進行判斷。

參考實例:https://www.jb51.net/article/139322.htm
————————————————
版權聲明:本文為CSDN博主「sleeppingforg」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/baidu_41601048/article/details/80954158


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM