【Vue路由守卫】

news2025/2/25 1:18:40

Vue路由守卫

  • Vue路由守卫
    • 全局路由守卫
      • 全局前置守卫
      • 全局后置守卫
      • 实例代码:
    • 独享守卫
    • 组件内守卫
    • 总结


Vue路由守卫

路由守卫,简单理解来说就是,当用户要进行一些操作时,我需要用户的一些信息或数据或行为,我判断过后,才会同意用户进行操作,说到这里,我想大家心里都或多或少有点理解了吧,官方一点的解释就是进行操作的鉴权,当操作与之条件匹配时,操作成功,当操作与之不匹配时,操作终止,作用就是是对路由进行权限控制。

在Vue中,路由守卫分为三种:全局路由守卫、独享路由守卫以及组件内路由守卫

全局路由守卫

全局路由守卫,顾名思义,一旦配置,那么作用范围就是所有的路由,全局路由又分为全局前置守卫全局后置守卫

全局前置守卫

全局前置守卫,组件初始化时调用,每次路由切换之前调用,路由切换之前指的就是,举个例子说,当前我在A路由组件,我要切换到B路由组件,那么前置路由守卫就是在我点了切换按钮,但B路由组件还没有被呈现在页面上的时候被调用。

//全局前置守卫
router.beforeEach((to,from,next) =>{
  //第一个参数to,包含的内容是切换后的路由对象,也就是跳转后的路由对象
  //第二个参数from,包含的内容的是切换前的路由对象,也就是跳转前的路由对象
  //第三个参数next(),是否往下执行,执行的话,如果不写的话路由就不会跳转,操作将会终止
})

全局后置守卫

全局后置守卫,组件初始化时调用,每次路由切换之后调用,路由切换之后指的就是,举个例子说,当前我在A路由组件,我要切换到B路由组件,那么前置路由守卫就是在我点了切换按钮B路由组件呈现到页面中后被调用。

router.afterEach((to,from) =>{
  //第一个参数to,包含的内容是切换后的路由对象,也就是跳转后的路由对象
  //第二个参数from,包含的内容的是切换前的路由对象,也就是跳转前的路由对象

实例代码:

下面我写的实例是当时看网课尚硅谷老师教的,结合浏览器的Local Storage做出鉴权操作:
主要的就是src/store/index.js文件中的配置
src/store/index.js:

//该文件用于创建整个应用的router
//首先,需要引用vue-router
import VueRouter from "vue-router";

//引入路由组件
import TestA from '../pages/TestA'
import TestB from '../pages/TestB'
// 引入二级路由组件
import TestBHzw from '../pages/TestBHzw'
import TestBHyrz from '../pages/TestBHyrz'

import DataList from '../pages/DataList'

//创建并暴露一个VueRouter
const router =  new VueRouter({
    routes:[
        //配置路由路径和路由组件
        {
            //这里的路径可自由定义,但是为了初学者好理解,我就采用和组件同样的命名,防止在写路径的时候搞混
            name:'导航一',
            path:'/TestA',
            component:TestA,     //要跳转到的组件   
            children:[
                {
                    // 给二级路由起名字
                    name:'DataName',
                    path:'DataList/:introduce',     //起到占位作用
                    component:DataList
                }
            ]
        },
        {
            name:'导航二',
            path:'/TestB',
            component:TestB,
            meta:{isAuth:true,},
            // 配置二级路由
            children:[
                {
                    path:'TestBHzw',     //重点注意,不要加 /
                    component:TestBHzw
                },
                {
                    path:'TestBHyrz',
                    component:TestBHyrz
                }
            ]
        }
    ]
})

//全局前置路由,配合浏览器localStorage进行鉴权操作
router.beforeEach((to, from, next) =>{
    //首先,我们先看一看to和from参数,next就是执行的意思,不写页面是不会跳转的
    // console.log(to, from);
    if(to.meta.isAuth){     //判断是否需要鉴权
        if(localStorage.getItem('name') === '张三'){
            next();
        }else{
            alert('不好意思,姓名不对,没有权限');
        }
    }else{
        next()
    }
})

// 全局后置路由,简单写一个弹窗,在进入每一个路由组件后弹出一句话
router.afterEach(() =>{
    alert('欢迎你!!');
})

export default router;

TestA.vue:

<template>
  <div>
    <h4>著名动漫简介</h4>
    <ul>
      <li v-for="i in DataList" :key="i.id">
        <!-- 使用params参数传递动态参数 注意:params传递参数必须配合name属性-->
        <router-link :to="{
          name:'DataName',
          params:{
            introduce:i.introduce
          }
        }">{{i.name}}</router-link>
      </li>
    </ul>
    <router-view></router-view>
  </div>
</template>

<script>
export default {
    name:'TestA',
    data(){
      return{
        DataList:[
          {
            id:1,
            name:'《海贼王》',
            introduce:'《航海王》是日本漫画家尾田荣一郎作画的少年漫画作品,于1997年7月22日在集英社《周刊少年Jump》开始连载。改编的电视动画《航海王》于1999年10月20日起在富士电视台首播。'
          },
          {
            id:2,
            name:'《火影忍者》',
            introduce:'电视动画《火影忍者》改编自日本漫画家岸本齐史的同名漫画,2002年10月3日在东京电视台系列全6局、岐阜放送首播,共220话;第二季《火影忍者疾风传》于2007年2月15日-2017年3月23日在东京电视台播出,共500话;累计全720话。'
          },
          {
            id:3,
            name:'《斗破苍穹》',
            introduce:'《斗破苍穹》是一部由阅文集团旗下起点中文网作家天蚕土豆同名玄幻长篇经典小说改编的动画。该动画第一季已于2017年1月7日在腾讯视频上映,bilibili同步跟播,共十二集。'
          },
          {
            id:4,
            name:'《鬼灭之刃》',
            introduce:'《鬼灭之刃》是日本漫画家吾峠呼世晴所著的少年漫画,自2016年2月15日—2020年5月11日在集英社《周刊少年Jump》上连载。已完结。'
          }
        ]
      }
    }
}
</script>

<style scoped>
h4{
  text-align: center;
}
a{
  text-decoration: none;
}
.active:visited{
  color: brown;
}
</style>

TestB.vue:

<template>
  <div>
    <h4>我是内容二</h4>
    <!-- 多级路由 -->
    <div class="box">
      <!-- 此处路径一定要写完整路径 -->
      <router-link to="/TestB/TestBHzw" active-class="active">点击查看《海贼王的简介》</router-link>&nbsp;&nbsp;&nbsp;
      <router-link to="/TestB/TestBHyrz" active-class="active">点击查看《火影忍者的简介》</router-link>
      <hr>
      <router-view></router-view>
    </div>
  </div>
</template>

<script>
export default {
    name:'TestB',
}
</script>

<style scoped>
h4{
  text-align: center;
}
.box{
  text-align: center;
}
a{
  text-decoration: none;
}
.active:visited{
  color: brown;
}
</style>

DataList.vue:

  <template>
  <div>
      <ul>
          <!-- 采用插值语法就可以拿到父级路由中的数据 -->
          <li>{{$route.params.introduce}}</li>
      </ul>
  </div>
</template>

<script>
export default {
    name:'DataList'
}
</script>

<style>

</style>

TestBHzw.vue和TestBHyrz.vue的结构是一样的,就不重复展示了:

<template>
  <div>
    <p>
      电视动画《火影忍者》改编自日本漫画家岸本齐史的同名漫画,
      2002年10月3日在东京电视台系列全6局、岐阜放送首播,共220话;
      第二季《火影忍者疾风传》于2007年2月15日-2017年3月23日在东京电视台播出,共500话;累计全720话。
    </p>
  </div>
</template>

<script>
export default {
    name:'TestBHyrz'
}
</script>

<style>

</style>

当然,想要配置路由守卫,前提就是把基本的路由配置好

因为不管是前置守卫和后置守卫,都有三个参数,netx()我们已经说过,不写的话不会往下一步走,
那么我们输出一下
to
from看看
当前页面是初始化页面,所以此时输出的to, from都是空对象。
在这里插入图片描述
当我们点击 “导航一” 时,to里面有了新内容,为什么from没有呢,是因为我们处于最顶层初始化页面,在我们点击之前,我们是没有路由的,所以只能捕获到我们要去往哪一个路由组件,匹配不到我们来自哪一个路由组件
在这里插入图片描述
当我们处于第一级路由的 “导航一” 跳往 “导航二” 时,此时的to和from就显而易见了
在这里插入图片描述
要想配合localStorage来实现鉴权,我们就要先在浏览器中给他一对key—value
在这里插入图片描述
现在我们就可以把鉴权的操作写在前置守卫中了
在这里插入图片描述
后置守卫就简单实现一下进入组件后实现弹窗
在这里插入图片描述

此时我们切换到“导航二”组件时,前置路由守卫已经拒绝了我们的访问,那是因为我在鉴权操作中,匹配的名字是“张三”
在这里插入图片描述
把名字改为“王五”后,我们可以正常访问“导航二”组件了
在这里插入图片描述


独享守卫

组件独享守卫是在进入组件时被调用,区别就在于,想对那个路由进行权限控制就直接在其路由配置项中添加守卫,作用域也仅限于该路由

beforeEnter(to,from,next){
  //第一个参数to,包含的内容是切换后的路由对象,也就是跳转后的路由对象
  //第二个参数from,包含的内容的是切换前的路由对象,也就是跳转前的路由对象
  //第三个参数next(),是否往下执行,执行的话,如果不写的话路由就不会跳转,操作将会终止
}

可自行去尝试,其实效果都是一样的,只不过,全局路由守卫服务的是所有路由组件,而独享路由守卫只服务于被配置的单个路由组件


组件内守卫

当使用路由规则进入该组件或离开该组件时,就会触发组件内守卫的调用,而组件内守卫的作用于范围也仅限于该组件

//进入守卫:通过路由规则,进入该组件时被调用
beforeRouteEnter (to, from, next) {
  //第一个参数to,包含的内容是切换后的路由对象,也就是跳转后的路由对象
  //第二个参数from,包含的内容的是切换前的路由对象,也就是跳转前的路由对象
  //第三个参数next(),是否往下执行,执行的话,如果不写的话路由就不会跳转,操作将会终止
},
//离开守卫:通过路由规则,离开该组件时被调用
beforeRouteLeave (to, from, next) {
  //第一个参数to,包含的内容是切换后的路由对象,也就是跳转后的路由对象
  //第二个参数from,包含的内容的是切换前的路由对象,也就是跳转前的路由对象
  //第三个参数next(),是否往下执行,执行的话,如果不写的话路由就不会跳转,操作将会终止
}

唯一不同于之前的就是
BeforeRouterLeave(),它并不像全局后置守卫一样在路由组件加载完成之后调用,而是在你切换出这个组件后被调用,也就是离开这个组件后被调用,在开发中,我们也可以使用BeforeRouterLeave() 来完成某些操作,比如当我要切换出该组件事,我希望该组件的操作能暂停,而不是一直运行,只有当我切换回该组件时,又再次运行,这样的操作就可以配合着beforeRouteEnter() 来完成,也可以提高应用的性能


总结

路由守卫在实际开发过程中是一个较为重要的知识点,其作用和功能在实际开发中也大大方便了我们的开发,在对用户鉴权操作时也提高了我们编写代码的小效率,以上就是我个人在学习时对路由守卫的理解和笔记。
在这里插入图片描述
纸上得来终觉浅,绝知此事要躬行!!

创作不易,记得点赞收藏加关注哟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/405659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【1024用代码改变世界】useMemo 和 useCallback|React.memo使用场景

欢迎来到我的博客 &#x1f4d4;博主是一名大学在读本科生&#xff0c;主要学习方向是前端。 &#x1f36d;目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 &#x1f6e0;目前正在学习的是&#x1f525;React/小程序React/小程序React/小程序&am…

【HTML+CSS】实现网页的导航栏和下拉菜单

熟练的使用导航栏,对于任何网站都非常重要,我们可以使用CSS转换为好看的导航栏而不是枯燥的HTML菜单。同时,我们使用 CSS 可以创建一个鼠标移动上去后显示下拉菜单的效果。 水平导航栏: 垂直导航栏: 文章目录 一.CSS导航栏1. HTML设置菜单项2. 垂直导航栏3. 水平导航栏3…

卸载,重新安装node

因为我的node版本比较低,需要换成高一点的版本,所以需要先卸载 卸载node 直接点卸载就可以了 重新安装 node下载网站:下载 | Node.js 中文网http://nodejs.cn/download/ 1 选择符合自己电脑的node(下载的的长期支持版本-这个比较稳定) 2 选择自己要安装的路径(最好自己选一…

前端练手3D爱心

文章目录盒子模型常用属性&#xff08;认识&#xff09;效果一 爱心半边效果二 爱心整合生成效果三 实现立方体爱心最终效果 3D爱心盒子模型常用属性&#xff08;认识&#xff09; overflow: hidden;定义盒子不随浮动 margin-left: 50px:使盒子距离外边距左(右上下)50px margin…

前端面试宝典~Symbol、相同的Set、Getter、控制动画、js中哪些操作会造成内存泄漏?等......

前端JavaScript面试题&#x1f353;&#x1f353;Symbol&#x1f353;&#x1f353;相同的Set&#x1f353;&#x1f353;Getter&#x1f353;&#x1f353;控制动画&#x1f353;&#x1f353;js中哪些操作会造成内存泄漏?html页面的骨架&#xff0c;相当于人的骨头&#xff…

vscode下载和安装教程和配置中文插件(超详细)

前言必读 读者手册&#xff08;必读&#xff09;_云边的快乐猫的博客-CSDN博客 前言&#xff1a; vscode主要是用于前端的编程工具&#xff0c;其他编程的语言也可以在vscode里面编程运行。 优点&#xff1a;简洁、占用内存小、界面美观 一、下载步骤 1.到官网根据自己的操…

vue里面使用pdfjs-dist+fabric实现pdf电子签章!!!

2022.9.6 一、需求 最近领导提了一个新需求&#xff1a;仿照e签宝&#xff0c;实现pdf电子签章&#xff01; 最终实现效果图 这是做出来的效果图&#xff0c;当然还有很多待修改 二、思路 然后我就去看了下人家e签宝的操作界面&#xff0c;左侧是印章&#xff0c;右侧是…

Vue 原理整理

目录 1. 组件化基础>&#xff08;MVVM模型&#xff09; 2. Vue的响应式原理 3.为什么在 Vue3.0 采用了 Proxy,抛弃了 Object.defineProperty&#xff1f; 4.computed 的实现原理 5. computed 和 watch 有什么区别及运用场景? 6. Vue 中的 key 到底有什么用&#xff…

VUE中watch的详细使用教程

1、watch是什么&#xff1f; watch:是vue中常用的侦听器&#xff08;监听器&#xff09;&#xff0c;用来监听数据的变化 2、watch的使用方式如下 watch: { 这里写你在data中定义的变量名或别处方法名: { handler(数据改变后新的值, 数据改变之前旧的值) { 这里写你拿到变化值后…

uniApp实现热更新

热更新 热更新是开发中常见且常用的一种软件版本控制的方式&#xff0c;在uniapp进行使用热更新将软件实现更新操作 思路: 服务器中存储着最新版本号&#xff0c;前端进行查询可以在首次进入应用时进行请求版本号进行一个匹对如果版本号一致则不提示&#xff0c;反之则提示进行…

Layui的layer.confirm弹框用法,很详细

Layui的弹框用法一、官网示例二、自定义一些样式1、自定义标题2、给提示框内容加上图标3、定义按钮的位置4、自定义关闭按钮5、自定义遮罩6、自定义点击弹框外遮罩关闭弹框7、定义唯一弹框8、自定义弹框出场动画9、关闭弹框动画10、设置弹框可以最大或者最小化11、设置弹框固定…

前端react axios 发送post请求fastapi响应报错422 (Unprocessable Entity)

post请求fastapi响应报错:422 (Unprocessable Entity) 最近在学习和使用fastapi的时候遇到了一个问题,就是发送了post请求后服务器端回应:422 (Unprocessable Entity), 具体含义: HTTP 422 状态码表示服务器理解请求实体的内容类型&#xff0c;并且请求实体的语法是正确的&am…

CSS盒子居中的6种方法!

大家好, 我是菜鸟,今天给大家带来几种css盒子居中的方法! 1.flex布局设置居中 常见的一种方式就是使用flex布局设置居中。 利用弹性布局(flex)&#xff0c;实现水平居中&#xff0c;其中justify-content 用于设置弹性盒子元素在主轴&#xff08;横轴&#xff09;方向上的对…

如何成功安装webpack

按照B站里的视频总是报错&#xff0c;于是去CSDN里尝试了多种方法&#xff0c;也不知道是哪种方法有效了&#xff0c;叠加了多种方法&#xff0c;都记下来。 做换行变色的例子时不会变色。因为jQuery包属于es6语法&#xff0c;并不是所有浏览器都能支持es6语法。因此&#xff0…

resetFields重置初始值不生效的原因

问题 最近在做项目的时候, dialog组件回调close里面 一般我都会加个resetFields 重置初始值和校验 其他地方都没问题, 在table组件里面出问题了, 后来经过监听vue tools, 查看到resetFields后, formData没变, 最后也找到原因了. 解决 1、用 dialog【新增】、【修改】数据 2、…

uniapp 项目搭建

1、uni-app 简介 uni-app 是一个使用 Vue.js 开发所有前端应用的框架。开发者编写一套代码&#xff0c;可发布到 iOS、Android、H5、以及各种小程序&#xff08;微信/支付宝/百度/头条/QQ/钉钉/淘宝&#xff09;、快应用等多个平台。 详细的 uni-app 官方文档&#xff0c;请翻…

一个简单的网页设计HTML5作业

前言&#xff1a; HTML5是Web中核心语言HTML的规范&#xff0c;用户使用任何手段进行网页浏览时看到的内容原本都是HTML格式的&#xff0c;在浏览器中通过一些技术处理将其转换成为了可识别的信息。HTML5在从前HTML4.01的基础上进行了一定的改进&#xff0c;虽然技术人员在开发…

如何在vue项目中使用rem布局

如何在vue项目中使用rem布局 场景&#xff1a; 在我们开发移动端项目中&#xff0c;实现手机页面布局&#xff0c;需要使用rem布局&#xff0c;那么该如何使用呢&#xff1f; 本文就详细的讲解了在vue项目中使用rem布局的整个过程&#xff0c;可以仔细阅读哦&#xff01; 方法&…

对象 和 json 互转 四种方式 json-lib、Gson、FastJson、Jackson

文章目录一、 json-lib二、 Google的Gson1.简介2. 配置步骤1. MAVEN 依赖引入2. gsonUtil 工具类3. 排除不要序列化的熟悉注解类 Exclude三. 阿里巴巴的FastJson1.简介2.配置步骤1.引入maven2. 配置 CustomFastjsonConfig3. 测试4. 开源的Jackson简介&#xff1a;Jackson配置Ob…

手把手教你入门Vue,猴子都能看懂的教程

目录标题一、Vue简介二、模板语法2.1 插值语法2.2 指令语法三、数据绑定3.1 单向数据绑定3.2 双向数据绑定四、写法区别4.1 el写法4.2 data写法五、MVVM模型六、数据代理七、事件处理7.1 基本使用7.2 修饰符7.3 键盘事件7.3.1 系统提供7.3.2 原始key值7.3.3 系统修饰键八、计算…