Vue 路由导航守卫(全局守卫、路由独享守卫、组件内守卫)详解:
路由守卫 官方解释

“导航”表示路由正在发生改变。正如其名,vue-router提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。

简单的说,导航守卫就是路由跳转过程中的一些钩子函数。路由跳转是一个大的过程,这个大的过程分为跳转前中后等等细小的过程,在每一个过程中都有一函数,这个函数能让你操作一些其他的事儿,这就是导航守卫。类似于组件生命周期钩子函数

路由守卫分类

一 全局守卫: 是指路由实例上直接操作的钩子函数,特点是所有路由配置的组件都会触发,直白点就是触发路由就会触发这些钩子函数

【1.1】全局前置守卫 beforeEach(to,from, next)在路由跳转前触发,这个钩子作用主要是用于登录验证,也就是路由还没跳转提前告知,以免跳转了再通知就为时已晚

const router = new VueRouter({ ... })router.beforeEach((to, from, next) => {// ...
})

【1.2】全局解析守卫 beforeResolve(to,from, next)这个钩子和beforeEach类似,也是路由跳转前触发,区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,即在 beforeEach 和 组件内beforeRouteEnter 之后,afterEach之前调用

【1.3】全局后置钩子 afterEach(to,from)和beforeEach相反,它是在路由跳转完成后触发,它发生在beforeEach和beforeResolve之后,beforeRouteEnter(组件内守卫)之前。这些钩子不会接受next函数也不会改变导航本身

router.afterEach((to, from) => {// ...
})

二 独享守卫: 是指在单个路由配置的时候也可以设置的钩子函数

【2.1】路由独享守卫 beforeEnter(to,from, next)和beforeEach完全相同,如果两个都设置了,beforeEnter则在beforeEach之后紧随执行。在路由配置上直接定义beforeEnter守卫

const router = new VueRouter({routes: [{path: '/foo',component: Foo,beforeEnter: (to, from, next) => {// ...}}]
})

三 组件守卫: 是指在组件内执行的钩子函数,类似于组件内的生命周期,相当于为配置路由的组件添加的生命周期钩子函数

<template>...
</template>
<script>
export default{data(){//...},beforeRouteEnter (to, from, next) {// 在渲染该组件的对应路由被 confirm 前调用// 不!能!获取组件实例 `this`// 因为当守卫执行前,组件实例还没被创建},beforeRouteUpdate (to, from, next) {// 在当前路由改变,但是该组件被复用时调用// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。// 可以访问组件实例 `this`},beforeRouteLeave (to, from, next) {// 导航离开该组件的对应路由时调用// 可以访问组件实例 `this`}
}
</script>
<style>...
</style>

【3.1】组件前置守卫 beforeRouteEnter(to,from, next)
该钩子在全局守卫beforeEach和独享守卫beforeEnter之后,全局beforeResolve和全局afterEach之前调用,要注意的是该守卫内访问不到组件的实例,也就是this为undefined。因为它在组件生命周期beforeCreate阶段触发,此时的新组件还没有被创建。在这个钩子函数中,可以通过传一个回调给 next来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数

beforeRouteEnter (to, from, next) {next(vm => {// 通过 `vm` 访问组件实例})
}

【3.2】 组件更新守卫 beforeRouteUpdadte(to,from, next)
在当前路由改变时,并且该组件被复用时调用,可以通过this访问实例

【3.3】 组件离开守卫 beforeRouteLeave(to,from, next)
导航离开该组件的对应路由时调用,可以访问组件实例this。这个离开守卫通常用来禁止用户在还未保存修改前突然离开。该导航可以通过next( false )来取消

beforeRouteLeave (to, from , next) {const answer = window.confirm('Do you really want to leave? you have unsaved changes!')if (answer) {next()} else {next(false)}
}

路由守卫参数介绍

to:即将要进入的目标路由对象;

from:即将要离开的路由对象;

next:涉及到next参数的钩子函数,必须调用next()方法来resolve这个钩子,否则路由会中断在这,不会继续往下执行

next():进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是confirmed(确认的)。
next( false )中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到from路由对应的地址。
next( ’ / ‘)或者next({ paht:’ / ’ }):跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。可传递的参数可以是router-link标签中的to属性参数或router.push中的选项
next( error ):如果传入next的参数是一个Error实例,则导航会被终止且该错误会被传递给router.onError()注册过的回调。

完整的导航解析过程

1 触发进入其它路由
2 调用要离开路由的组件守卫beforeRouteLeave
3 调用全局的前置守卫beforeEach
4 在重用的组件里调用 beforeRouteUpdate
5 在路由配置里调用 beforeEnter
6 解析异步路由组件
7 在将要进入的路由组件中调用beforeRouteEnter
8 调用全局的解析守卫beforeResolve
9 导航被确认
10 调用全局的后置钩子afterEach。
11 触发 DOM 更新mounted。
12 执行beforeRouteEnter守卫中传给 next的回调函数

路由钩子在实际开发中的应用场景

路由钩子在实际的开发过程中使用较少, 我在实际的项目中只在组件内使用过beforeRouteLeave, 使用场景分别为一下三类情况

清除当前组件中的定时器

当一个组件中有一个定时器时, 在路由进行切换的时候, 可使用 beforeRouteLeave 将定时器进行清楚, 以免占用内存

beforeRouteLeave (to, from, next) {window.clearInterval(this.timer) //清楚定时器next()
}

当页面中有未关闭的窗口, 或未保存的内容时, 阻止页面跳转

如果页面内有重要的信息需要用户保存后才能进行跳转, 或者有弹出框的情况. 应该阻止用户跳转

beforeRouteLeave (to, from, next) {//判断是否弹出框的状态和保存信息与否if (this.dialogVisibility === true) {this.dialogVisibility = false //关闭弹出框next(false) //回到当前页面, 阻止页面跳转}else if(this.saveMessage === false) {alert('请保存信息后退出!') //弹出警告next(false) //回到当前页面, 阻止页面跳转}else {next() //否则允许跳转}
}

保存相关内容到Vuex中或Session中

当用户需要关闭页面时, 可以将公用的信息保存到session或Vuex中

beforeRouteLeave (to, from, next) {localStorage.setItem(name, content); //保存到localStorage中next()
}

原文链接:https://blog.csdn.net/weixin_38083836/article/details/113932103

Vue中 路由导航守卫(全局守卫、路由独享守卫、组件内守卫)相关推荐

  1. Vue 路由导航守卫(全局守卫、路由独享守卫、组件内守卫)详解

    Vue 路由导航守卫(全局守卫.路由独享守卫.组件内守卫)详解: 路由守卫 官方解释 "导航"表示路由正在发生改变.正如其名,vue-router提供的导航守卫主要用来通过跳转或取 ...

  2. Vue 路由 导航守卫(全局守卫、路由独享守卫、组件内守卫)

    一.全局守卫 1. router.beforeEach((to,from,next)=>{}) 2. 回调函数中的参数,to:进入到哪个路由去,from:从哪个路由离开,next:函数,决定是否 ...

  3. vue3:路由守卫(全局守卫、路由独享守卫、组件内守卫)

    router.js:全局守卫 import {createRouter,createWebHashHistory } from 'vue-router'// 省略了routes 中的路由规则 cons ...

  4. 路由守卫(全局守卫,局部守卫,组件内守卫)

    路由守卫 作用:对路由进行权限控制 分类:全局守卫.独享守卫.组件内守卫 全局守卫: //全局前置守卫:初始化时执行.每次路由切换前执行 router.beforeEach((to,from,next ...

  5. Vue 中设置浏览器的 title 跟随路由的名称变化

    Vue 中设置浏览器的 title 跟随路由的名称变化 浏览器title的变化会根据路由的变化而改变 可以先设置一个公共的文件夹setting, 用于存放公共的名称, 例如这里的 `小火车况且况且 m ...

  6. vue中style的scoped属性这样用,修改第三方组件iview 或 element 样式

    vue中style的scoped属性这样用,修改第三方组件iview 或 element 样式 文章目录 vue中style的scoped属性这样用,修改第三方组件iview 或 element 样式 ...

  7. Vue声明式路由导航和编程式路由导航的优缺点及实现方法

    文章目录 前言 路由实现 1.目标 2.前置条件 <1>安装vue-router插件 <2>写个用于转跳的组件页 <3>写路由文件 <4>写路由锚点 3 ...

  8. vue中 根据权限 动态的设置路由

    本篇文章主要讲的是使用vue的框架 vue-element-admin, 来解决根据不同的角色权限, 显示不同的路由. ⽅式⼀,后台返回⾓⾊树形路由表,前端添加动态路由 ⽅式⼆,后台返回⽤户⾓⾊,前端 ...

  9. 导航守卫之组件内守卫及后置钩子

    一.路由守卫 1.只有点击路由Admin时才会打印消息,并处于点击前的页面 2.只有点击路由Admin时才会打印消息,显示的是点击后的页面:但如果是next(false)则页面不会跳转 3.路由独享守 ...

最新文章

  1. 苹果过审ipv6问题
  2. [项目过程中所遇到的各种问题记录]图表篇——asp.net上不错的图表选择—FunsionCharts...
  3. Lambda表达式在Java 8中的简单应用
  4. jQuery中国各个省份地图分部代码
  5. 解决:The ‘Access-Control-Allow-Origin‘ header contains multiple values‘x, *‘, but only one is allowed.
  6. ‘map’ does not name a type
  7. LeetCode 209. 长度最小的子数组 (滑动窗口)
  8. SSAS: Display measures in Rows
  9. 106. 数据库增删改的封装
  10. 稳定不掉线,翀旭用飞鱼星解决高密Wi-Fi接入
  11. 程序员居然都玩起“直播”,你的好友工程狮已经上线!
  12. 比较好用的mysql可视化工具-----pycharm连接mysql图文教程
  13. 树莓派3B通过mentohust登录锐捷校园网有线端,并创建WIFI(开热点)供其他设备使用,同时实现开机自启动
  14. 冰点还原离线激活_冰点还原密钥,小编教你如何激活冰点还原
  15. 探索未来|一文看懂小米年度技术峰会 · 软件技术专场
  16. Android 视频裁剪 (含裁剪 View)
  17. jax_ws_JAX-RS和OpenAPI对Hypermedia API的支持:任重而道远
  18. 两线制智能仪表的信号隔离方案
  19. sublime text 64位 3.3114 绿色汉化版下载地址
  20. 五分钟认清三款主流 Java Virtual Machine丨HotSpot、JRockit、J9

热门文章

  1. 万润新能源递交上会稿:单季营收15亿 拟募资12.6亿
  2. 再预告:DIY大宝剑,大宝剑二号 ——名字还没想好
  3. 天天吃货商城02-首页展示、商品分类、商品推荐、商品搜索、商品评价
  4. 全国大学生女子足球锦标赛
  5. 计算机科学与技术答辩技巧,计算机专业毕业论文答辩自述稿
  6. 自动挂载和手动挂载的区别·
  7. 【Python】批量下载新浪微博某用户的头像相册
  8. 微盟程序员删库跑路,被判刑六年!
  9. P17-Windows与网络基础-Windows文件共享
  10. Centos安装Oracle11Gr2到84%的时候报错Error in invoking target ‘install‘ of makefile