导航菜单

Vue Router:Vue.js 的官方路由管理器

什么是 Vue Router?

Vue Router 是 Vue.js 的官方路由管理器。它与 Vue.js 核心深度集成,让构建单页应用变得轻而易举。主要功能包括:

  • 嵌套路由映射
  • 动态路由选择
  • 模块化的、基于组件的路由配置
  • 路由参数、查询、通配符
  • 细粒度的导航控制
  • 带有自动激活的 CSS class 的链接

基础路由配置

安装和基本设置

# 安装 vue-router
npm install vue-router@4

路由导航

<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',
    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'

import ReferenceAnswer from '@/components/common/ReferenceAnswer.vue';

// 离开路由前确认
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 来模拟完整的 URL
const router = createRouter({
  history: createWebHashHistory(),
  routes
})

// History 模式 - 使用 HTML5 History API
const router = createRouter({
  history: createWebHistory(),
  routes
})

最佳实践

  1. 路由组织

    • 按功能模块组织路由
    • 使用懒加载优化性能
    • 合理设置路由元信息
  2. 导航安全

    • 实现必要的导航守卫
    • 处理未授权访问
    • 保护用户数据
  3. 性能优化

    • 路由组件懒加载
    • 预加载重要路由
    • 缓存频繁访问的组件

进阶技巧

路由元信息

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 应用至关重要。通过合理的路由设计和优化,可以显著提升应用的用户体验和性能。

搜索