Vue3 路由

关键要点

  • Vue3 路由(Vue Router)是官方工具,用于单页面应用(SPA)实现无刷新内容切换。
  • 核心组件包括 <router-link>(导航)和 <router-view>(渲染当前路由)。
  • 支持懒加载、嵌套路由、参数传递和导航守卫,适合复杂应用。
  • 部署时,历史模式需服务器配置,避免 404 错误。

什么是 Vue3 路由?

Vue3 路由允许通过不同的 URL 访问不同内容,适合构建单页面应用(SPA)。它不会重新加载页面,而是通过组件切换实现导航,提升用户体验。

基本使用

  1. 安装:使用 npm install vue-router@4 或 CDN 方式安装。
  2. 配置:创建路由实例,定义路由规则,例如:
   import { createRouter, createWebHashHistory } from 'vue-router'
   const router = createRouter({
     history: createWebHashHistory(),
     routes: [{ path: '/', component: Home }]
   })
  1. 使用:在模板中用 <router-link to="/">Home</router-link> 导航,用 <router-view> 渲染内容。

高级功能

  • 懒加载:用 component: () => import('./views/Home.vue') 提高性能。
  • 嵌套路由:支持多级路由,如 /user/profile
  • 导航守卫:如 beforeEach 检查权限,beforeRouteLeave 控制离开。

部署注意事项

历史模式(createWebHistory)需服务器配置(如 Nginx 的 try_files),否则刷新可能出现 404。哈希模式(createWebHashHistory)无需配置,但 URL 包含 #



详细报告

Vue3 路由(Vue Router)是 Vue.js 的官方路由管理器,专为单页面应用(SPA)设计,通过将 URL 映射到不同的组件,实现无刷新内容切换。它与 Vue3 的组件系统深度集成,支持复杂路由需求,如懒加载、嵌套路由和导航守卫。以下是全面的中文讲解,涵盖基本概念、配置方法、高级功能和部署注意事项。

背景与定义

Vue3 路由的核心目标是让开发者能够通过浏览器 URL 访问不同的内容,而不需重新加载页面。这种方式特别适合现代 Web 应用,提升用户体验和性能。Vue Router 4.x 是 Vue3 的官方版本,与 Vue2 的路由有一定差异,需注意兼容性。

基本使用

安装与初始化

首先,需要安装 vue-router。推荐使用 npm 或 yarn:

  • npm install vue-router@4
  • 或使用 Taobao 镜像:cnpm install vue-router@4

如果使用 CDN,可以直接引用:https://unpkg.com/vue-router@4

创建路由实例

使用 createRouter() 创建路由实例,需指定历史模式和路由规则。以下是基本示例:

import { createRouter, createWebHashHistory } from 'vue-router'
import Home from './views/Home.vue'
import About from './views/About.vue'

const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About }
]

const router = createRouter({
  history: createWebHashHistory(),
  routes
})
  • history 参数支持三种模式:
  • createWebHashHistory():哈希模式,URL 包含 #,如 [invalid url, do not cite]
  • createWebHistory():历史模式,无 #,更友好,但需服务器配置。
  • createMemoryHistory():内存模式,适合服务端渲染。
注册与使用

在主应用中注册路由:

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

createApp(App).use(router).mount('#app')

在模板中使用核心组件:

  • <router-link to="/">Home</router-link>:创建导航链接,to 指定目标路由。
  • <router-view></router-view>:渲染当前路由对应的组件。

<router-link> 支持多种属性,详见下表:

属性描述
to目标路由(字符串或对象,如 { path: '/home' }
replace使用 router.replace(),不记录历史
append相对路径添加,如 /ab 变为 /a/b
tag渲染为指定标签(如 <li>),仍触发导航
active-class激活状态的 CSS 类,默认 router-link-exact-active
event触发导航的事件(如 mouseover

高级功能

路由懒加载

为提高性能,可使用动态导入实现懒加载:

const routes = [
  { path: '/', component: () => import('./views/Home.vue') },
  { path: '/about', component: () => import('./views/About.vue') }
]

这会在路由访问时才加载对应组件,特别适合大型应用。

嵌套路由

支持多级路由,适合复杂页面结构。例如:

const routes = [
  {
    path: '/user',
    component: () => import('./views/User.vue'),
    children: [
      { path: 'profile', component: () => import('./views/UserProfile.vue') },
      { path: 'settings', component: () => import('./views/UserSettings.vue') }
    ]
  }
]

User.vue 中需包含 <router-view>,以渲染子路由。

路由参数

支持动态路由参数,例如:

const routes = [
  { path: '/user/:id', component: UserDetail }
]

在组件中访问参数:

  • Options API:this.$route.params.id
  • Composition API:useRoute().params.id
导航守卫

导航守卫用于控制路由跳转,分为全局、路由独享和组件内守卫:

  • 全局守卫:router.beforeEach((to, from, next) => { ... }) 检查权限。
  • 路由独享:beforeEnter 在路由配置中定义。
  • 组件内守卫:beforeRouteEnterbeforeRouteUpdatebeforeRouteLeave

目录结构与实践

推荐将路由文件放在 src/router 下,常见结构包括:

  • index.ts:路由入口,创建并导出路由实例。
  • routes.ts:路由配置,可按业务模块拆分(如 game.tsmember.ts)。

使用 TypeScript 时,路由配置需使用 RouteRecordRaw 类型,确保类型安全。

部署与注意事项

历史模式 vs 哈希模式
  • 历史模式createWebHistory):推荐使用,URL 无 #,如 [invalid url, do not cite]需服务器配置,否则刷新可能 404。
  • 哈希模式createWebHashHistory):URL 包含 #,如 [invalid url, do not cite]支持所有浏览器,无需服务器配置。
服务器配置

使用历史模式时,需配置服务器。例如 Nginx 配置:

location / {
  try_files $uri $uri/ /index.html;
}

这确保刷新页面时仍能找到路由。

常见问题
  • 刷新 404:历史模式下,服务器未配置 try_files 会导致问题。
  • 子路由白屏:确保 base 路径正确,如 /subpath/,或使用绝对路径 /

API 与使用

Vue3 推荐使用 Composition API,访问路由:

  • useRouter():获取路由实例,调用 pushreplace 等方法。
  • useRoute():获取当前路由信息,如 route.pathroute.params

在 Options API 中,仍可使用 this.$routerthis.$route,但不推荐。

参考资源


关键引文

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注