Vue Router导航守卫

导航守卫就是在路由跳转的时候进行一些操作或保护。比如一个用户直接修改URL进入管理页面,但是导航守卫检测到这个行为,把路由跳转到登录页面,让他进行登录。

导航解析

  1. beforeRouteLeave守卫
  2. 全局守卫beforeEach
  3. beforeRouteUpdate守卫
  4. beforeEnter守卫
  5. beforeRouteEnter守卫
  6. beforeResolve守卫
  7. afterEach守卫

全局前置守卫beforeEach

router.beforeEach是一个全局前置守卫,即在路由跳转之前执行。它有3个参数:to,from,next.

  • to:前往的路由
  • from:从哪个路由来
  • next:是否让路由通过,next()表示让路由跳转,next(‘/login’)表示让路由跳转到登录页,和router.push('/login')一样

下面来模仿一个真实的网站路由守卫,我们都知道一般的网站都要登录才能进入,登录之后一段时间内cookies会记住你的信息,让你不必登录直接进入。但是如果没有登录,通过直接修改URL强行进入网站,路由守卫这时就起作用了,它检测到你没有登录就会让你跳转到登录页。

import {createWebHistory,createRouter,createWebHashHistory} from 'vue-router'
import Cookies from 'vue-cookies'
const routes=[
  {path: '/login',component:()=>import('../../components/Login.vue')},
  {path: '/home',component:()=>import('../../components/Home.vue')},
]
const router=createRouter({
  history: createWebHistory(),
  routes
})

router.beforeEach((to,from,next)=>{
  // userinfo是自己在定义cookies起的名字 如果没能拿到里面的信息说明没有登录
  const userinfo=Cookies.get('userinfo')
  if(!userinfo&&to.path!='/login') {
      next('/login') //和router.push('/login')一样 前往登录页
  }else {
      next() //登录了可以跳转到其他页面
  }
})
export default router

结果如下:可以看到我想通过改变URL来进入Home这个页面,但它还是会跳转到登录页

全局解析守卫beforeResolve

router.beforeResolverouter.beforeEach类似,官方文档说区别在于所有的组件内守卫和异步路由组件被解析之后解析守卫被调用。并不是很理解这句话,反正在beforeRouteEnter之后在afterEach之前被调用。

全局后置钩子afterEach

全局后置钩子afterEach的作用是进行一些辅助性功能,例如在路由跳转之后进行弹框提醒或者更改页面标题等。它是在页面跳转之后调用,参数中没有next。

router.afterEach((to,from)=>{
  if(to.path=='/login') alert('请进行登录')
})

路由独享守卫beforeEnter

上面的都是在全局配置的守卫,还可以在配置routes的时候配置beforeEnter守卫。beforeEnter只在进入路由时触发,不会在params、query和hash改变时触发,从/user/001跳转到/user/002不会触发,从/user/2#info跳转到/user/2#post也不会触发。

还有一些守卫这里就不再介绍了,很多都是不怎么用的,用的最多的是beforeEachafterEach了。

Vue RouterVue.js 的官方路由器,允许我们构建单页面应用(SPA)。导航守卫Vue Router 中一种非常有用的机制,用来在路由发生变化前后执行一些代码。这些守卫可以全局或局部地定义,也可以在导航的不同阶段定义。 ### 全局守卫 全局守卫主要有三种: 1. `beforeEach`:在路由改变之前进行守卫,这是最常见的全局守卫。 2. `beforeResolve`:在 `beforeRouteEnter` 和 `beforeRouteUpdate` 守卫被调用后被调用。 3. `afterEach`:在路由改变之后进行守卫,不会接受 next 函数,不能改变导航本身。 使用示例: ```javascript router.beforeEach((to, from, next) => { // ... next(); }); router.afterEach((to, from) => { // ... }); ``` ### 路由独享守卫 在路由配置中直接定义 `beforeEnter` 守卫: ```javascript const router = new VueRouter({ routes: [ { path: '/foo', component: Foo, beforeEnter: (to, from, next) => { // ... next(); } } ] }); ``` ### 组件内守卫 组件内守卫是在路由组件内直接定义的,主要有: 1. `beforeRouteEnter`:在渲染该组件的对应路由被 confirm 前调用。 2. `beforeRouteUpdate`:在当前路由改变,但是该组件被复用时调用。 3. `beforeRouteLeave`:导航离开该组件的对应路由时调用。 使用示例: ```javascript export default { beforeRouteEnter (to, from, next) { next(vm => { // 通过 `vm` 访问组件实例 }) }, beforeRouteUpdate (to, from, next) { // ... next(); }, beforeRouteLeave (to, from, next) { // ... next(); } } ``` ### 完整的导航解析流程 1. 导航被触发。 2. 在失活的组件里调用 `beforeRouteLeave` 守卫。 3. 调用全局的 `beforeEach` 守卫。 4. 在重用的组件里调用 `beforeRouteUpdate` 守卫 (2.2+)。 5. 在路由配置里调用 `beforeEnter`。 6. 解析异步路由组件。 7. 在被激活的组件里调用 `beforeRouteEnter`。 8. 调用全局的 `beforeResolve` 守卫 (2.5+)。 9. 导航被确认。 10. 调用全局的 `afterEach` 钩子。 11. 触发 DOM 更新。 12. 调用 `beforeRouteEnter` 守卫中传给 `next` 的回调函数,创建好的组件实例会作为回调函数的参数传入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值