不同於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