程序员的知识教程库

网站首页 > 教程分享 正文

vue导航守卫(vue导航守卫有哪些)

henian88 2024-10-10 05:55:46 教程分享 6 ℃ 0 评论

一 全局的导航守卫

定义在全局的,也就是我们 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 的回调函数,创建好的组件实例会作为回调函数的参数传入。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表