Vue Router 导航守卫

本文介绍了VueRouter中的导航守卫,包括全局导航守卫(beforeEach和afterEach)、导航独享守卫(beforeEnter)和组件导航守卫。通过示例展示了如何在路由切换时实现登录验证,确保用户权限管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是导航守卫

导航守卫用于控制路由的访问权限。例如,访问后台主页时,需要用户处于已登录状态,如果没有登录,则跳转到登录页面。用户在登录页面进行登录操作,若登录成功,则跳转到后台主页;若登录失败,则返回登录页面。

导航守卫主要分为全局导航守卫导航独享守卫组件导航守卫

1.1全局导航守卫

包括全局前置守卫beforeEach()和全局后置守卫afterEach(),在路由即将改变前和改变后进行触发。

1.2导航独享守卫

目前只有beforeEnter()守卫,只有在路由导航到一个不同的页面时才会被触发, beforeEnter()守卫只适用于单个路由。

1.3组件导航守卫

包括beforeRouteEnter()beforeRouteUpdate()beforeRouteLeave()3个守卫,分别表示在路由进入之前被触发、在路由更新之前被触发、在路由离开之前被触发。

二、导航守卫的语法 

全局导航守卫会拦截每个路由规则从而对每个路由进行访问权限的控制定义全局导航守卫的示例代码如下

const router = createRouter()

router.beforeEach((to, from, next) => {})  //定义全局前置守卫beforeEach()

router.afterEach((to, from, next) => {})    //定义全局后置守卫afterEach()

 每个全局导航守卫方法中接收3个形参:tofromnext

  • to:表示目标路由对象
  • from:表示当前导航正要离开的路由对象
  • nextnext函数,如果不接收next()函数,则默认允许用户访问每一个路由;如果接收了next()函数,则必须调用next()函数,否则不允许用户访问任何一个路由。注意:next()函数具有3种调用方式,分别为next()、next(false)和next('/'),其中,next()表示执行下一个钩子函数;next(false)表示强制停留在当前页面;next('/')表示跳转到其他地址。
 三、全局导航守卫的代码演示

本文代码是在Vue Router 编程式导航-CSDN博客的基础上进行修改的。

3.1创建Login.vue登录组件
<template>
  <div class="login-container">
    登录页面
  </div>
</template>
3.2在router.js中定义全局导航守卫
// router.js文件内容如下:
import { createRouter, createWebHashHistory } from "vue-router"
import Movie from "./components/Movie.vue"

// // 创建路由实例对象
const router = createRouter({
    history: createWebHashHistory(),
    routes: [
        { path: '/movie/:id', name:'MovieName' , component: Movie, props: true },
        // 导航守卫-登录组件
        { path: '/login', name: 'Login', component: () => import('./components/Login.vue') }
    ]
})

// 注册全局导航守卫
router.beforeEach((to, from, next) => {
    let isLogin = false // 假设用户没有登录
    if (to.name == 'MovieName') { // 判断用户是否要进入电影详情页
      if (isLogin) { // 如果用户已经登录,则直接进入电影详情页
        next() // 放行
      } else { // 如果用户没有登录
        next({ name: 'Login' }) // 跳转到登录页
      }
    } else { // 如果用户不是要进入电影详情页
      next() // 放行
    }
  })

// 导出路由实例对象
export default router
3.3浏览器可视化

在浏览器中访问http://localhost:5173/,页面显示App.vue程序入口文件;单击“电影2”链接,页面显示登录组件。

 

附本节项目代码下载地址:

链接:https://pan.baidu.com/s/12XcBKvGxS_tNy38NVaLLag?pwd=8888 
提取码:8888

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` 的回调函数,创建好的组件实例会作为回调函数的参数传入。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值