zoukankan      html  css  js  c++  java
  • 一个简单的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

  • 相关阅读:
    内容绘制到Bitmap上不成功警示
    一些c++面试题目
    Windows Socket 主要API功能
    面试问题(一)
    函数指针与指针函数
    机器学习和数据挖掘的网站
    vs2010打开vs2008程序出现错误
    MATLAB将矩阵使用.txt文件格式保存
    指针实现值交换
    堆与栈的区别
  • 原文地址:https://www.cnblogs.com/GGbondLearn/p/12207257.html
Copyright © 2011-2022 走看看