当前位置: 首页 > news >正文

Vue导航守卫学习

Vue 导航守卫(Navigation Guards)学习文档

适用版本:Vue Router 3.x(Vue 2)/ Vue Router 4.x(Vue 3,语法略有差异)

一、什么是导航守卫

导航守卫是 Vue Router 提供的路由跳转过程中的钩子函数,主要用于:

  • 登录鉴权 / 权限校验
  • 页面标题(document.title)设置
  • 数据预取
  • 阻止或重定向非法跳转
  • 埋点、离开确认等

它们会在路由发生变化时按固定顺序依次触发


二、三大分类

1. 全局守卫(定义在router实例上)

constrouter=newVueRouter({routes})// ① 前置守卫:最常用,登录校验主战场router.beforeEach((to,from,next)=>{// to: 目标路由// from: 离开的路由// next: 放行函数(必须调用,否则路由停滞)next()})// ② 解析守卫:在组件内守卫和异步路由组件被解析之后触发router.beforeResolve((to,from,next)=>{next()})// ③ 后置钩子:导航已完成,无 next,常用于埋点、滚动复位router.afterEach((to,from)=>{window.scrollTo(0,0)})

2. 路由独享守卫(定义在路由配置里)

{path:'/settlement',component:Settlement,beforeEnter:(to,from,next)=>{// 仅对当前路由生效next()}}

3. 组件内守卫(定义在组件选项里)

exportdefault{// ⚠️ 此时组件实例尚未创建,拿不到 thisbeforeRouteEnter(to,from,next){next(vm=>{// 通过回调访问实例(唯一的特例)})},// 当前路由改变、但组件复用时触发(如 /user/1 → /user/2)beforeRouteUpdate(to,from,next){this.fetchData(to.params.id)next()},// 离开时触发,this 可用,常用于「未保存提示」beforeRouteLeave(to,from,next){if(this.formDirty&&!confirm('有未保存内容,确定离开?')){next(false)// 取消导航}else{next()}}}

三、next()的用法

调用方式含义
next()放行,继续跳转到to
next(false)中断,回到当前页(from
next('/login')重定向到指定路径
next(new Error(...))触发router.onError
next(vm => {...})beforeRouteEnter可用

Vue Router 4 (Vue 3)中改为return语义:return true / false / '/login',不再强制next


四、完整的导航解析顺序(重点)

一次跳转会按以下顺序触发:

1. 导航被触发 2. 在失活组件里调用 beforeRouteLeave 3. 调用全局 beforeEach 4. 在重用组件里调用 beforeRouteUpdate 5. 调用路由配置里的 beforeEnter 6. 解析异步路由组件 7. 在被激活组件里调用 beforeRouteEnter 8. 调用全局 beforeResolve 9. 导航被确认 10. 调用全局 afterEach 11. 触发 DOM 更新 12. 调用 beforeRouteEnter 中 next 传入的回调

记忆口诀:「离开 → 全局前置 → 复用更新 → 独享 → 解析组件 → 进入 → 全局解析 → 确认 → 全局后置」


五、实战:登录鉴权(典型场景)

使用token标记需要登录的路由,可在router/index.js这样实现:

import{getToken}from'@/utils/auth'// 从 Cookie 读取 USER_TOKENconstWHITE_LIST=['/login','/register','/403']router.beforeEach((to,from,next)=>{// 1. 设置页面标题document.title=to.meta.tabTitle||'资环链金智慧平台'consthasToken=getToken()if(hasToken){if(to.path==='/login'){next({path:'/'})// 已登录则拦截登录页}else{next()// 正常放行}}else{// 白名单放行,其余统一跳登录并带上 redirectWHITE_LIST.includes(to.path)?next():next(`/login?redirect=${encodeURIComponent(to.fullPath)}`)}})

六、常见坑位

  1. 忘记调用next()→ 页面卡住、白屏,最经典的错误。
  2. 死循环beforeEach里重定向到自己(如已登录又next('/login')),需加条件分支。
  3. 异步校验:鉴权接口需await后再next(),否则拿不到结果就放行了。
  4. beforeRouteEnter拿不到this:必须用next(vm => {...})回调。
  5. 组件复用不触发created:参数变化(/detail/1/detail/2)只触发beforeRouteUpdate,需在此重新请求数据,或在<router-view :key="$route.fullPath">强制重建。

七、速查表

守卫位置是否能取消跳转典型用途
beforeEach全局登录/权限校验
beforeResolve全局数据预加载完成后处理
afterEach全局标题、滚动、埋点
beforeEnter路由单路由鉴权
beforeRouteEnter组件进入前数据校验
beforeRouteUpdate组件动态参数变化
beforeRouteLeave组件离开确认/防误操作

八、Vue 3 补充(Composition API)

<script setup>中可用专用钩子:

<script setup> import { onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router' onBeforeRouteLeave((to, from) => { const answer = window.confirm('确定离开吗?') if (!answer) return false // 取消导航 }) onBeforeRouteUpdate((to, from) => { // 路由参数变化时触发 fetchData(to.params.id) }) </script>

注意:Vue 3 中没有onBeforeRouteEnter,进入前逻辑需通过beforeEnter路由独享守卫或在组件setup中直接处理。

http://www.jsqmd.com/news/1139282/

相关文章:

  • 煤炭井下通信链路隐患排查,GN-W10A 测试设备适配矿山复杂网络环境
  • 为什么说Notepad--是你跨平台文本编辑的最佳选择?
  • 如何创建openEuler新语言翻译团队?完整申请与审批流程指南
  • CryptoJS v4.0.0 模块化升级与实战:JavaScript加密库核心用法解析
  • 【Springboot毕设全套源码+文档】基于springboot蔬菜超市系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 秋冬服装营销缺创意?先知大模型重塑内容生产力
  • 2026最新微信小程序怎么做自己的店铺全流程
  • AI合规工具:AI合规审计工具的选型与使用指南
  • TLS证书撤销机制深度解析:从CRL、OCSP到Nginx实战配置
  • AI-Shoujo HF Patch完整安装与配置指南:从模组整合到创作平台搭建
  • AutoGLM安卓端侧部署实战:从ADB到本地大模型运行
  • 城市污水管网监测的主要内容
  • 在后台服务中使用 Scoped 服务,为什么总是报错?
  • 从闭源平台的数据困局,到搭建真正属于自己的 AI 知识库
  • CTF Web入门:从HTTP响应包中寻找Flag的侦察思维与实战方法
  • 影刀RPA新手教程:界面布局完全指南——指令区、画布区、属性区深度解析与使用技巧
  • MD5加密Java代码?别找了,就这30行直接抄
  • Pytest+Requests+Allure:构建现代化接口自动化测试框架的实践指南
  • 【2026深度解析】Web渗透测试全流程实战指南:从信息收集到AI攻防进阶
  • WAM-Nav:不对称架构驱动的可解释机器人导航框架
  • Audacity音频编辑全攻略:从零开始掌握专业音频处理技巧
  • WebSocket 连接池生产级实现:实时行情高可用与负载均衡
  • 2.6.升级 containerd
  • STM32与MC6470 IMU运动控制开发实战
  • 嵌入式AI编程:代码补全的本质与智能开发重定义
  • 2024接口测试实战:从契约到自动化,应对微服务与多仓复杂场景
  • 基于大数据+Hadoop的智能客服系统的设计与实现毕业设计任务书
  • AI视频风格迁移实战:从原理到代码实现监控画风附身
  • 对象存储全景深度解析:MinIO 与阿里云OSS全维度对比分析
  • WSA-Pacman:Windows 11安卓应用管理的终极图形化解决方案