一个简单的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

原文地址:https://www.cnblogs.com/GGbondLearn/p/12207257.html

时间: 2024-10-10 03:31:41

一个简单的react路由拦截的相关文章

搭建一个简单的React项目

我是使用了create-react-app来搭建的基本框架,其中的原理和vue-cli差不多的脚手架.(当然也可以自己配置项目目录,这里我偷了一下懒) npm install -g create-react-app 先装脚手架 create-react-app elemApp 这样就可以生成一个名为elemApp的react初始框架了 这上面的就不细说了,用过三大框架的应该都清楚. 1.创建目录结构 其实这些目录都是可以按照个人习惯来定义,但是不可缺少的一定要加上 2.安装路由(创建Router

ASP.NET MVC如何做一个简单的非法登录拦截

摘要:做网站的时候,经常碰到这种问题,一个没登录的用户,却可以通过localhost:23244/Main/Index的方式进入到网站的内部,查看网站的信息.我们知道,这是极不安全的,那么如何对这样的操作进行拦截呢,这里记录我学到的一个小小方法. 以下是我要记录的正文部分: 开始讲之前声明一点,我目前的能力着实很有限,有些东西并不很懂,也可能讲不清楚,有些知识表述可能是错误的(尽量避免),主要是把我对这部分做法的理解记载下来,以后自己独立开发的时候确保不会忘记. 非法登录拦截,主要用到的是.ne

原生JS实现一个简单的前端路由(原理)

说一下前端路由实现的简要原理,以 hash 形式(也可以使用 History API 来处理)为例, 当 url 的 hash 发生变化时,触发 hashchange 注册的回调,回调中去进行不同的操作,进行不同的内容的展示. 直接看代码或许更直观. 1 function Router() { 2 this.routes = {}; 3 this.currentUrl = ''; 4 } 5 Router.prototype.route = function(path, callback) {

[email&#160;protected]一个简单的UI-Router路由demo

1.index.html: <!DOCTYPE HTML><html ng-app="routerApp"><head>    <title>UI-Router路由demo</title>    <meta charset="utf-8">        <link rel="stylesheet" href="../framework/bootstrap-3

webpack 打包一个简单react组件

安装Webpack,并加载一个简单的React组件 全局的npm模块安装: npm install -g webpack 安装jsx-loader npm install --save-dev jsx-loader 默认使用当前目录的自己新创建的webpack.config.js作为配置文件 module.exports = { entry: [ './assets/js/entry.js' ], output: { path: __dirname + '/assets/', publicPat

withRouter的作用和一个简单应用

作用:把不是通过路由切换过来的组件中,将react-router 的 history.location.match 三个对象传入props对象上 默认情况下必须是经过路由匹配渲染的组件才存在this.props,才拥有路由参数,才能使用编程式导航的写法,执行this.props.history.push('/detail')跳转到对应路由的页面 然而不是所有组件都直接与路由相连(通过路由跳转到此组件)的,当这些组件需要路由参数时,使用withRouter就可以给此组件传入路由参数,此时就可以使用

几款简单的 React Native UI 组件

本文推荐 11 个非常棒的 React Native 开源组件,希望能给移动应用开发者提供帮助. React Native 是近期 Facebook 基于 MIT 协议开源的原生移动应用开发框架,已经用于 Facebook 的生产环境.React Native 可以使用最近非常流行的 React.js 库来开发 iOS 和 Android 原生 APP. 1. iOS 表单处理控件 tcomb-form-native tcomb-form-native 是 React Native 强大的表单处

PHP实现一个简单url路由功能

如果一个页面的内容呈现,需要根据url上传递的参数来进行渲染.很多时候可能是这样子写:xxx.com/xx?c=x&m=x& t=..,而我们看到的url往往是这样子的(以新浪微游戏的咖啡恋人为例) game.weibo.com/ilovecoffee….这种URL设计看上去比前一种更好一点:) 如果我们访问一下不存在的游戏应用,例如game.weibo.com/ilovecoffee222,则会输出如下的错误提示: game.weibo.com后面匹配到的项,指向了某个php页面,然后根

我的一个react路由之旅(步骤及详图)

今天开始react一个重要部分的xiao~习,路由~(过程截图,最后附代码) 以下代码只能骗糊涂蛋子,没错,就是我自己,不要打算让我敲出多高级的东西~ 理论性知识几乎没有,请不要打算让我给你说原理啥的,原理性的东西,网上很多,我现在搬砖学习很开心,勿忘初心~ (1)首先,你确定你安装了react环境,这第一步难度系数1,菜鸟级别的不演示了 (2)接下来,你要是用react路由,需要安装路由插件 1 npm install react-router-dom --save-dev //这里可以使用c