第四章:Vue Router

核心目标:掌握单页面应用(SPA)的路由原理,实现复杂的嵌套路由管理,并利用导航守卫构建严密的权限控制体系。


📋 本章核心知识点

知识点 说明 难度
路由原理 History API 与 Hash 模式的差异 ⭐⭐
路由配置 嵌套路由、动态路由、重定向 ⭐⭐
导航守卫 全局、独享与组件级守卫的执行顺序 ⭐⭐⭐
编程式导航 在 JS 中自由穿梭
路由元信息 meta 的高级玩法(权限、标题、动画) ⭐⭐⭐

4.1 SPA 路由:为什么页面不刷新?

4.1.1 传统 MPA vs 现代 SPA

  • MPA (多页面应用):每次点击链接,浏览器都会向服务器请求一个全新的 HTML。
  • SPA (单页面应用):整个应用只有一个 HTML。点击链接时,JavaScript 会拦截请求,仅替换页面中的一部分内容,并同步更新浏览器地址。

4.1.2 路由模式

  1. Web History 模式 (推荐):
    • URL 看起来很像正常的地址 example.com/user/1
    • 注意:部署时需要后端配合配置重定向,否则刷新 404。
  2. Web Hash 模式
    • URL 中包含 # 号,如 example.com/#/user/1
    • 优点:不需要后端配置,兼容性极好。

4.2 导航守卫:路由的"保安"

导航守卫是路由系统中最强大的功能,它允许我们在导航发生前拦截并执行逻辑。

4.2.1 全局前置守卫 (beforeEach)

这是实现 权限校验 的最佳位置。

ts 复制代码
router.beforeEach((to, from) => {
  // 检查目标路由是否需要登录
  if (to.meta.requiresAuth && !isLoggedIn()) {
    return { path: '/login' } // 重定向到登录页
  }
})

4.2.2 完整的导航生命周期

当点击链接到加载组件,Vue Router 执行顺序如下:

  1. 失活组件:onBeforeRouteLeave
  2. 全局前置:beforeEach
  3. 路由独享:beforeEnter
  4. 解析组件:beforeRouteEnter
  5. 全局后置:afterEach

4.3 编程式导航 vs 声明式导航

  • 声明式 :使用 <RouterLink to="/home">。它本质上渲染为一个 <a> 标签,但会被 Vue Router 拦截。
  • 编程式 :使用 router.push('/home')。通常用于逻辑执行后的跳转(如登录成功后转入首页)。

4.4 路由元信息 (Meta)

meta 是一个灵活的对象,可以承载任何自定义数据。

  • requiresAuth: 是否需要登录。
  • title: 页面网页标题。
  • transition: 页面切换的具体动画名称。

4.5 性能优化:组件懒加载

通过动态导入(Dynamic Import),我们可以实现组件的按需加载,大幅减少首屏 JS 的体积。

ts 复制代码
const UserProfile = () => import('./views/UserProfile.vue')

📌 章节实战建议

  1. 参数解耦 :在路由配置中使用 props: true,将 URL 参数直接作为 Props 传给组件,避免组件过度依赖 $route 对象。
  2. 加载反馈 :在全局守卫中配合 NProgress 插件,在路由切换时展示顶部的加载进度条。
  3. 返回策略 :合理使用 router.replace 代替 router.push,防止产生过多的历史记录(如登录成功重定向后,不希望用户点击后退回到登录页)。

🔗 专栏链接Vue 3 全栈开发实战专栏

📦 项目源码资源点击下载项目源码

相关推荐
小月土星1 天前
JavaScript 快速排序:从 pivot、双指针到分治思想
javascript·算法·面试
lichenyang4531 天前
JSBridge 分发升级:为什么要从 if-else 变成 Registry > 这是「ASCF 架构升级」系列的第 3 篇
前端
小月土星1 天前
JavaScript 递归入门:从 1 到 n 求和,再到数组扁平化
javascript·算法·面试
码上天下1 天前
流式响应断了,前端怎么自动重连续传
前端
anyup1 天前
来简单聊聊鸿蒙开发,万元奖金的事~
前端·华为·harmonyos
北凉温华1 天前
Univer 在线表格模块使用说明
前端
lichenyang4531 天前
WebRuntimePage 拆分:从大页面到运行时控制器
前端
竹林8181 天前
从报错到跑通:我用 @solana/web3.js 开发 Solana 钱包连接踩过的三个坑
前端
MariaH1 天前
Node中操作MySQL
前端
还有多久拿退休金1 天前
一个 var 让整个团队加班到凌晨——JS 闭包的那些暗坑
前端·javascript