什么是 Vue Router?
Vue Router 是 Vue.js 的官方路由管理器。它与 Vue.js 核心深度集成,让构建单页应用变得轻而易举。主要功能包括:
- 嵌套路由映射
- 动态路由选择
- 模块化的、基于组件的路由配置
- 路由参数、查询、通配符
- 细粒度的导航控制
- 带有自动激活的 CSS class 的链接
基础路由配置
安装和基本设置
# 安装 vue-routernpm install vue-router@4
import { createRouter, createWebHistory } from 'vue-router'import Home from '../views/Home.vue'import About from '../views/About.vue'
const routes = [ { path: '/', name: 'Home', component: Home }, { path: '/about', name: 'About', component: About }]
const router = createRouter({ history: createWebHistory(), routes})
export default router
import { createApp } from 'vue'import App from './App.vue'import router from './router'
const app = createApp(App)app.use(router)app.mount('#app')
路由导航
<template> <nav> <!-- 使用 router-link 组件进行导航 --> <router-link to="/">首页</router-link> | <router-link to="/about">关于</router-link> </nav>
<!-- 路由出口 --> <router-view></router-view></template>
动态路由匹配
参数路由
const routes = [ { path: '/user/:id', name: 'User', component: User, // 可选参数 path: '/optional/:id?', // 多个参数 path: '/multiple/:category/:id', // 正则表达式 path: '/user/:id(\\d+)' }]
<template> <div> <h2>用户详情</h2> <p>用户 ID:{{ $route.params.id }}</p> <p>用户名:{{ userData.name }}</p> </div></template>
<script setup>import { ref, onMounted } from 'vue'import { useRoute } from 'vue-router'
const route = useRoute()const userData = ref({})
onMounted(async () => { // 获取路由参数 const userId = route.params.id // 根据 ID 获取用户数据 userData.value = await fetchUserData(userId)})</script>
嵌套路由
配置嵌套路由
const routes = [ { path: '/user/:id', component: User, children: [ { // 当 /user/:id/profile 匹配成功 path: 'profile', component: UserProfile }, { // 当 /user/:id/posts 匹配成功 path: 'posts', component: UserPosts } ] }]
嵌套视图
<template> <div class="user-layout"> <nav> <router-link :to="`/user/${id}/profile`">个人资料</router-link> | <router-link :to="`/user/${id}/posts`">文章列表</router-link> </nav>
<router-view></router-view> </div></template>
导航守卫
全局守卫
router.beforeEach((to, from) => { // 检查用户是否已登录 const isAuthenticated = checkAuth()
if ( // 检查目标路由是否需要认证 to.matched.some(record => record.meta.requiresAuth) && // 检查用户是否未登录 !isAuthenticated ) { // 重定向到登录页 return { path: '/login', query: { redirect: to.fullPath } } }})
路由独享守卫
const routes = [ { path: '/admin', component: Admin, beforeEnter: (to, from) => { // 检查用户权限 if (!hasAdminRole()) { return '/403' } } }]
组件内守卫
<script setup>import { onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'
// 离开路由前确认onBeforeRouteLeave((to, from) => { const answer = window.confirm('确定要离开吗?未保存的数据将会丢失') if (!answer) return false})
// 路由更新前处理onBeforeRouteUpdate(async (to, from) => { // 路由参数改变时重新获取数据 if (to.params.id !== from.params.id) { await loadData(to.params.id) }})</script>
路由懒加载
基本用法
// 使用动态导入实现路由懒加载const routes = [ { path: '/about', name: 'About', component: () => import('../views/About.vue') }, { path: '/user/:id', name: 'User', // 带有预加载的懒加载 component: () => import(/* webpackPrefetch: true */ '../views/User.vue') }]
按模块分组
const routes = [ { path: '/admin', component: () => import('../views/admin/Layout.vue'), children: [ { path: 'dashboard', component: () => import('../views/admin/Dashboard.vue') }, { path: 'users', component: () => import('../views/admin/Users.vue') } ] }]
路由模式
Hash 模式 vs History 模式
// Hash 模式 - 使用 URL hash 来模拟完整的 URLconst router = createRouter({ history: createWebHashHistory(), routes})
// History 模式 - 使用 HTML5 History APIconst router = createRouter({ history: createWebHistory(), routes})
最佳实践
-
路由组织
- 按功能模块组织路由
- 使用懒加载优化性能
- 合理设置路由元信息
-
导航安全
- 实现必要的导航守卫
- 处理未授权访问
- 保护用户数据
-
性能优化
- 路由组件懒加载
- 预加载重要路由
- 缓存频繁访问的组件
进阶技巧
路由元信息
const routes = [ { path: '/admin', component: Admin, meta: { requiresAuth: true, roles: ['admin'], title: '管理后台' } }]
// 使用元信息router.beforeEach((to, from) => { // 设置页面标题 document.title = to.meta.title || '默认标题'
// 检查权限 if (to.meta.requiresAuth && !isAuthenticated()) { return '/login' }
// 检查角色 if (to.meta.roles && !hasRole(to.meta.roles)) { return '/403' }})
滚动行为
const router = createRouter({ history: createWebHistory(), routes, scrollBehavior(to, from, savedPosition) { // 如果存在保存的位置,则返回保存的位置 if (savedPosition) { return savedPosition }
// 如果有哈希值,滚动到指定元素 if (to.hash) { return { el: to.hash, behavior: 'smooth' } }
// 否则滚动到顶部 return { top: 0 } }})
总结
Vue Router 是构建 Vue 单页应用的核心工具:
- 提供了完整的路由功能支持
- 与 Vue.js 深度集成
- 支持多种路由模式
- 提供丰富的导航控制
- 具有良好的性能优化选项
掌握 Vue Router 对于构建现代化的 Vue 应用至关重要。通过合理的路由设计和优化,可以显著提升应用的用户体验和性能。