大宇宇宇
发布于 2025-09-01 / 7 阅读
0
0

路由的理解

在Vue中,路由是实现单页面应用(SPA)页面跳转与组件切换的核心机制,通过管理URL与组件的映射关系,实现无刷新页面导航。

1. 核心作用

  • 无刷新跳转:通过改变URL路径,动态渲染对应组件,避免传统多页面应用的整页刷新。

  • 组件映射:将URL与具体组件绑定,用户访问特定路径时,自动加载对应组件(如 /home 映射 Home 组件)。

  • 状态管理:通过路由参数(如 /user/:id)传递数据,实现组件间通信或页面状态关联。

2. 核心库:Vue Router

Vue 官方路由管理器,需单独安装(npm install vue-router)。核心使用步骤:

  • 定义路由表:通过 routes 配置数组,声明路径与组件的映射(如 { path: '/home', component: Home })。

  • 创建路由实例new VueRouter({ routes }),可配置路由模式(hash/history)、base路径等。

  • 挂载到Vue实例:在根实例中注入路由,new Vue({ router }),使全局可访问 $router(路由实例)和 $route(当前路由信息)。

3. 路由模式(高频考点)

Vue Router 支持三种模式,通过 mode 配置:

  • hash模式(默认):URL带 #(如 http://abc.com/#/home),通过 hashchange 事件监听路径变化,兼容性好(支持所有浏览器),但URL不美观。

  • history模式:URL无 #(如 http://abc.com/home),基于HTML5 History API(pushState/replaceState),需服务端配置(刷新页面时,服务端需返回同一HTML,避免404)。

  • abstract模式:用于非浏览器环境(如Node.js、Weex),不依赖URL,通过内存管理路由历史。

4. 核心概念

(1)动态路由

路径带参数(如 /user/:id),通过 $route.params.id 获取参数,适用于详情页等场景(如用户ID、订单号动态传递)。

(2)嵌套路由

通过 children 配置子路由,实现组件嵌套(如 /home 下有 /home/news/home/message),需在父组件中用 <router-view> 渲染子组件。

(3)命名路由

通过 name 标识路由(如 { path: '/user/:id', name: 'user', component: User }),跳转时用 name 代替路径,简化代码(如 <router-link :to="{ name: 'user', params: { id: 1 } }">)。

(4)编程式导航 vs 声明式导航

  • 声明式:用 <router-link to="/home"> 跳转,类似 <a> 标签,语义化强。

  • 编程式:通过 this.$router.push('/home')(添加历史记录)、this.$router.replace('/home')(替换当前记录,不新增历史)、this.$router.go(-1)(后退)实现跳转,适用于逻辑控制(如表单提交后跳转)。

5. 路由守卫(权限控制核心)

通过守卫在路由跳转前后进行拦截,常用于权限校验、登录验证、数据预加载。分为三类:

  • 全局守卫beforeEach(全局前置守卫,登录验证常用)、beforeResolve(全局解析守卫)、afterEach(全局后置守卫,无next,常用于修改页面标题)。

  • 路由独享守卫:在路由配置中通过 beforeEnter 定义,仅对当前路由生效(如 { path: '/admin', component: Admin, beforeEnter: (to, from, next) => { ... } })。

  • 组件内守卫:在组件内通过 beforeRouteEnter(进入路由前,不能访问组件实例 this,需通过 vm 回调)、beforeRouteUpdate(路由复用组件时,如 /user/1/user/2)、beforeRouteLeave(离开组件前,如表单未保存提示)定义。

6. 路由懒加载(性能优化)

结合Vue异步组件和Webpack代码分割,实现按需加载组件,减少首屏资源体积。通过动态 import() 语法(如 component: () => import('./Home.vue')),Webpack会将组件单独打包,访问对应路由时才加载。

7. 关键区别:$router vs $route

  • $router:路由实例对象,包含跳转方法(push/replace/go)、全局配置等,是全局唯一的。

  • $route:当前路由信息对象,包含路径(path)、参数(params)、查询(query)、哈希(hash)等,每个组件实例独立。

总结

Vue Router是SPA的“神经中枢”,通过URL与组件的映射、路由守卫的权限控制、懒加载的性能优化,实现高效、友好的单页面导航。面试中需重点突出路由模式区别、守卫应用场景、懒加载原理,体现对路由从基础到进阶的理解。


评论