在 Vue 的世界里,路由那玩意儿,平时咱们写代码时只觉着是挺费事的,但真要拆开了看,发现它俩:一个负责“如何跑”,一个负责“在哪儿跑”。 Vue Router 这名字听着挺唬人,实际上核心就俩字:路由。它本质上就是个导航系统,专门管着 Vue 应用里的路径跳转逻辑。在 Vue 3 之前,我们有 Axios 这样的工具,能搞定后台数据请求;React 之前,有 React Router 这种思路,能把 URL 和状态绑定得更死。但到了 Vue,我们要兼顾反应速度和开发效率,便 Vue Router 就诞生了。它有个特别的地方,就是它能把“路由配置”和“动态组件”合二为一。你传一个路由元数据,它自动帮你生成对应的组件,省去了写自定义 `
` 和 `` 繁琐的代码。 这就好比你去某家酒店,前台(Router)告诉你房间号 101 住的是一般/平平房,房间号 201 住的是套房,你不用自己查资料。路由系统本身就是个导航员,它把静态页面跟动态内容打上了标签。
比如用户点首页,它自动加载那些基础模板;用户点管理员后台,它加载那些需求登录验证的专属页面。
这种机制让咱们前端开发不用写一大堆路由文件,就能实现复杂的页面跳转逻辑。 至于如何跳转,它主要供给三种模式。一种是“导航模式”,用户直接点击页面里的某个链接,Router 帮你算好要去哪个 URL,然后自动把页面加载好。
这时候路由表和配置表务必得对得上,配置表里写死的路由得对应上实际存有的链接,这是最好办踩坑的地方。另一种是“动态路由模式”,也就是动态渲染。
比如你在根目录放个 `Hello.vue`,你在某个路由配置里指定它显示这个组件。
这时候,只要配置的 URL 和代码里的组件名一致,你就能拿到这个页面。
这就像你明知道有个工作,但懒得去查,直接点一个按钮,系统立马给你渲染出那个页面。 还有一种是“路由跳转模式”,也就是一般/平平的单页应用跳转。用户点了个按钮,Router 会触发一个 `router.push` 要么 `router.replace`,把 URL 推或替换成新的,然后自动刷新对应页面。
这跟浏览器直接跳转挺像,只是多了点 Vue 的逻辑处理。 实际用起来,配置表是管理路由最核心的东西。它由路由元数据数组组成,每个元数据就是一个配置对象。
比如你写: ```javascript { path: '/admin', component: () => import('@/views/Admin/index.vue'), children: [ { path: '/admin/users', name: 'Users', component: () => import('@/views/Users/index.vue'), meta: { role: 'user' } }, { path: '/admin/audit', name: 'Audit', component: () => import('@/views/Audit/index.vue'), meta: { role: 'manager' } } ] } ``` 这段代码里,`path` 是地址,`component` 是渲染啥,`children` 是子路由。`meta` 字段挺关键,比如 `role` 这种权限检查用的信息。 实现路由跳转,最直接的就是 `router.push` 和 `router.replace`。`push` 是追加式跳转,比如 `/` 点 `/login`,会变成 `/login`;`replace` 则是替换式,比如 `/` 点 `/dashboard`,变成 `/dashboard` 就没了刚刚的 `/` 痕迹。
有时候为了体验更好,要么为了管住页面状态,咱们还得配合其他方式,比如 `router.beforeEach` 做守卫,要么记住上一次的路由。 还有几个细节得注意。
比如在 `meta` 里设置 `meta: { redirect: '/login' }`,这是强制跳转的友好提示,用户点进来发现需求登录,系统就自动把 `router.replace` 替换成登录页,别让用户自己去翻站外。再比如动态路由,有时候组件里传参,比如 `@vue/macros-compile` 这种宏,要么 `next`、`previous` 这样特殊的组件。
要是想用动态路由,得开启 `resolve: true` 要么 `resolve: false`。开启的话,你传的参数会直接赋值给组件属性,关闭的话,你得手动写 `this.$props` 要么 `this.$options`。 说到数据,动态路由实际上是个比较大的坑。
比如你定义了一个路由 `/user/:id`,然后传一个参数 `id: 123`。
要是组件里直接写 `this.$route.params.id`,它里面就出现了 `123`,这叫“硬编码”。
要是组件里写 `this.$route.name`,它会是 `user`,叫“软编码”。软编码别看撇脱,但有点依赖配置,不忒优雅。硬编码别看直接,但一旦改了配置,就要把代码复制粘贴。 举个例子,要是你有个用户列表路由 `/user/list`,想把这个页面的标题改成“我的订单”,你就得在配置表里改标题。但要是某个定时任务要么副功能,突然想把标题改成“最新订单”,这时候你得找到路由配置,修改 `meta.title`,然后记得在代码里同步更新 `this.$route.meta.title`。
这种改动有点好办漏,故此动态路由时,最好单独封装一个工具函数,比如 `updateRouteMeta`,专门负责这个更新逻辑。 还有,像 `router.beforeEach` 这样的钩子函数,是 Vue Router 里最实用的局部。它会在全局级别执行,不管走哪条路由,都跑一遍。
比如你能够写: ```javascript router.beforeEach((to, from, next) => { if (to.meta.requireAuth && !this.$store.state.login) { next('/login'); return; } if (to.path '/login') next('/'); next(); }); ``` 这样,任何需求登录的页面,只要没登录,系统自动带你走登录页,不用每次点进去都手动验证。 最终说说性能。Vue Router 的路由表,要是挺大的话,有时候会影响启动速度。
故此局部路由(children 里的子路由)加载的时候,默认是懒加载的,也就是 `Promise` 的 `then` 回调里才真正渲染。
这就好比你说“我要去 101 号房”,系统只加载 101 号房的代码,别的房间不管,这就挺省电。 总而言之,Vue Router 就是咱们前端路由的“骨架”。它负责把页面管起来,负责跳转,负责权限,负责那些动态的组件渲染。别看配置起来看着复杂,但只要逻辑理顺,配合好 `$route` 和 `$router`,就能让项目跑得飞快。
记住,别把它当成一个死板的配置表,多思索下它是如何驱动组件加载的,这样写起来会更顺手。