目录

  • 1 初识Vue.js
    • 1.1 Vue简介
    • 1.2 Vue开发环境
    • 1.3 Vue的初使用
  • 2 Vue.js 开发基础
    • 2.1 单文件组件
    • 2.2 数据绑定
    • 2.3 指令
    • 2.4 事件对象和事件修饰符
    • 2.5 计算属性和侦听器
    • 2.6 样式绑定
    • 2.7 案例:购物车模块
    • 2.8 案例:学习计划表
  • 3 组件基础(上)
    • 3.1 构建工具Vite
    • 3.2 选项式API和组合式API
    • 3.3 组合式编程
    • 3.4 生命周期
    • 3.5 组件的注册与引用
    • 3.6 组件通信
      • 3.6.1 父组件向子组件传递数据
      • 3.6.2 子组件向父组件传递数据
      • 3.6.3 跨级组件之间的数据传递
    • 3.7 案例:待办事项
  • 4 组件基础(下)
    • 4.1 动态组件
    • 4.2 插槽
    • 4.3 自定义指令
    • 4.4 引用静态资源
    • 4.5 案例:商品管理
  • 5 网络请求
    • 5.1 Axios
    • 5.2 Axios图书列表案例
  • 6 状态管理
    • 6.1 Vuex
    • 6.2 Pinia
  • 7 路由
    • 7.1 初识路由和VueRouter
    • 7.2 嵌套路由
    • 7.3 路由重定向
    • 7.4 动态路由
    • 7.5 命名路由
    • 7.6 编程式导航
    • 7.7 导航守卫
    • 7.8 案例:后台管理系统
  • 8 常用UI组件库
    • 8.1 Element Plus组件库
    • 8.2 Vant组件库
    • 8.3 Ant Design Vue组件库
  • 9 项目实战
    • 9.1 项目所需软件
    • 9.2 项目前台分析
    • 9.3 “微商城”后台分析
导航守卫

什么是导航守卫?

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


在登录功能中使用导航守卫的效果,如下图所示。



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

1. 全局导航守卫

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

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

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

每个全局导航守卫方法中接收3个形参:to、from和next。

  • to:表示目标路由对象;

  • from:表示当前导航正要离开的路由对象;

  • next:next为函数,如果不接收next()函数,则默认允许用户访问每一个路由;如果接收了next()函数,则必须调用next()函数,否则不允许用户访问任何一个路由。

注意:

next()函数具有3种调用方式,分别为next()、next(false)和next('/'),其中,next()表示执行下一个钩子函数;next(false)表示强制停留在当前页面;next('/')表示跳转到其他地址。




演示全局导航守卫的使用

使用全局导航守卫实现当进入MovieDetails组件时,判断当前用户是否登录,如果没有登录则跳转到登录页面,如果已登录则跳转到电影详情页面。

新建src\components\Login.vue文件,实现登录页面内容。

<template>
 <div class="login-container">
   登录页面
 </div>
</template>


在src\router.js文件的routes中添加路由匹配规则,通过name属性定义Login组件路由规则的名称。

{ path: '/login', name: 'Login', component: () => import ('./components/Login.vue') }


在src\router.js文件中,在最后一行代码“export default router”的上一行位置注册全局导航守卫。

router.beforeEach((to, from, next) => {
 let isLogin = false
 if (to.name == 'MovieDetails') {
   if (isLogin) { next()
   } else {
     next({ name: 'Login' })
   }
 } else { next() }
})


在浏览器中访问http://127.0.0.1:5173/。先切换到首页,然后单击“跳转到MovieDetails组件”链接,会显示登录页面,说明全局导航守卫拦截成功,如下图所示。



2. 导航独享守卫

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


3. 组件导航守卫

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

A- 组合式写法


B- 选项式写法