网站首页 > 教程分享 正文
一 全局的导航守卫
定义在全局的,也就是我们 index.js 中的 router 对象
1. 全局前置钩子函数beforeEach
全局前置守卫,在路由跳转前触发,它在 每次导航 时都会触发
参数:
to: 即将要进入的目标路由对象,to.name去匹配进入路由名称
from: 当前导航正要离开的路由对象,from.name去匹配离开的路由名称
next: 一定要调用该方法不然会阻塞路由。
注意: next 参数可以不添加,但是一旦添加,则必须调用一次,否则路由跳转等会停止。next()方法的几种情况:next(): 进行管道中的下一个钩子。next(false): 中断当前的导航。回到 from 路由对应的地址。next(’/’) 或者 next({ path: ‘/’ }): 跳转到一个不同的地址,可传递的参数与 router.push 中选项一致。next(error): 导航终止,且该错误会被传递给 router.onError() 注册过的回调 |
全局前置守卫可以定义多个,根据创建顺序调用。在所有守卫完成之前导航一直处于等待中。
/* 主要用于页面跳转时候的登录状态校验以及跳转地址的确定 */ // 要跳转到about页面的时候,如果能拿到token就跳过去,拿不到跳到登录页面 router.beforeEach((to, from, next) => { console.log('触发全局前置导航守卫beforeEach') if (to.name === 'about') { console.log('eeeeee') if (!localStorage.getItem('myToken')) { console.log('ddddddd') router.push('/login') } else { console.log('这是登录状态') } } } |
2. 全局前置钩子函数beforeResolve
全局解析守卫,在路由跳转前,所有 组件内守卫 和 异步路由组件 被解析之后触发,它同样在 每次导航 时都会触发。
router.beforeResolve 是获取数据或执行任何其他操作(如果用户无法进入页面时你希望避免执行的操作)的理想位置
router.beforeResolve((to, from, next) => { next(); }) |
3. 全局后置钩子函数afterEach
全局后置钩子,它发生在路由跳转完成后,beforeEach 和 beforeResolve 之后,beforeRouteEnter(组件内守卫)之前。它同样在每次导航时都会触发。这个钩子的两个参数和beforeEach 中的to和from 一样。然而和其它全局钩子不同的是,这些钩子不会接受 next函数,也不会改变导航本身。
它们对于分析、更改页面标题、声明页面等辅助功能以及许多其他事情都很有用
router.afterEach((to, from) => { console.log('触发全局后置守卫afterEach') }) |
二 路由独享守卫
就是跟路由相关的钩子,我们的路由守卫只有一个,就是 beforeEnter
需要在路由配置上定义 beforeEnter 守卫,此守卫只在进入路由时触发,在 beforeEach 之后紧随执行,不会在 params、query 或 hash 改变时触发。
{ path: '/home', name: 'home', component: home, beforeEnter: (to, from, next) => { console.log('触发路由独享守卫beforeEnter--HOME') if (!localStorage.getItem('myToken')) { console.log('请登录!!!') // next(false) // 禁止跳转 router.push('/login') next() } else { next() } } } |
三 组件守卫
定义在路由组件内部的守卫。
钩子函数和data、methods等是平级的
1. beforeRouteEnter
路由进入组件之前调用,该钩子在全局守卫 beforeEach 和路由守卫 beforeEnter 之后,全局 beforeResolve 和全局 afterEach 之前调用。
参数包括 to,from,next。
该守卫内访问不到组件的实例,也就是 this 为 undefined,也就是他在 beforeCreate 生命周期前触发。
beforeRouteEnter: (to, from, next) => { // 在beforeRouteEnter中不能使用this,需要使用vm来代替this,因为进入该组件之前被调用,组件实例还没有被创建,不能使用 this关键字 // 此时该组件还没被实例化 console.log('触发组件beforeRouteEnter') next(vm => { // 此时该组件被实例化了 alert(vm.home) // 弹出消息框信息为hw }) }, |
2. beforeRouteUpdate
对于 beforeRouteUpdate 来说,this 已经可用了,所以给 next 传递回调就没有必要了。
beforeRouteUpdate (to, from, next) { // 在当前路由改变,但是该组件被复用时调用 // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候, // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。 // 可以访问组件实例 `this` next() }, |
3. beforeRouteLeave
对于 beforeRouteLeave 来说,this 已经可用了,所以给 next 传递回调就没有必要了。
beforeRouteLeave: (to, from, next) => { console.log('触发了组件的beforeRouteLeave') next() }, |
四 导航全过程
.导航被触发。
.判断是不是离开上一个路由进来的这个路由,如果是在失活的组件里调用 beforeRouteLeave 守卫,然后调用全局的 beforeEach 守卫。否则就直接全局的 beforeEach 守卫。
.判断组件是不是被渲染过:
. 如果没有被渲染过,先调用路由独享守卫beforeEnter,解析异步路由组件后调用组件守卫beforeRouteEnter,然后调用全局的beforeResolve 。
.如果被渲染过,直接调用组件守卫beforeRouteUpdate ,然后调用全局的beforeResolve 。
.导航被确认,调用全局守卫afterEach ,触发dom更新。
.调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入。
猜你喜欢
- 2024-10-10 C/C++恶意代码盘点(二):后门丨文件监控丨自删除功能
- 2024-10-10 「面试题」和Vue.js有关的41个基础问题
- 2024-10-10 VueCLI3.0之vue-router路由详解(vue-router路由的作用)
- 2024-10-10 Vue经典面试题(vue常见面试题及答案2021)
- 2024-10-10 这几招技术,病毒木马经常用(病毒木马感染途径有哪些)
- 2024-10-10 前端知识点也可以当做面试题含vue
- 2024-10-10 计算机犯罪系列(二十五)脚本外挂模拟人工自动打怪刑事责任分析
- 2024-10-10 前端vue面试题(前端vue面试题目)
- 2024-10-10 Vue3.0+Vant3聊天室|vue3仿微信App聊天实例
- 2024-10-10 警惕Gorgon APT组织窃密攻击(apt窃密特点)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)