D33. 路由 vue-router
3.1. 🌐 前端路由代替后端管理单页面应用
SPA(Single Page Application):通过前端路由实现页面切换,无需刷新页面。Vue Router 是 Vue 的路由解决方案,通过 URL 的变化实现组件动态加载。
核心优势
- 无缝体验:用户无需等待页面加载,切换速度更快
- SEO友好:配合服务端渲染(SSR)可提升搜索引擎收录
- 统一管理:路由与组件解耦,便于维护
javascript
// 传统后端路由 vs 前端路由
// 后端路由:/user/123 → 服务器返回新 HTML
// 前端路由:/user/123 → 通过 Vue Router 加载 User 组件
3.2. 🛠️ 路由的定义参数与语法
3.2.1. 静态路由配置
javascript
// 路由配置示例
const routes = [
{ path: '/', component: Home }, // 首页
{ path: '/about', component: About }, // 关于页面
{ path: '/user', component: UserList }, // 用户列表
]
3.2.2. 动态路由参数
javascript
// 配置动态路由参数
{
path: '/user/:id',
component: UserDetails,
props: true // 开启参数传递
}
// 在组件中使用
<template>
<div>User ID: {{ $route.params.id }}</div>
</template>
3.2.3. 嵌套路由
javascript
// 配置父子路由
{
path: '/user',
component: User,
children: [
{ path: 'profile', component: UserProfile }, // /user/profile
{ path: 'orders', component: UserOrders } // /user/orders
]
}
3.2.4. 路由别名与重定向
javascript
// 别名配置
{ path: '/home', component: Home, alias: '/main' }
// 重定向配置
{ path: '/old-path', redirect: '/new-path' }
3.3. 🔌 路由集成在 Vue 中使用
3.3.1. 安装与基础配置
bash
npm install vue-router@4
javascript
// src/router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import Home from '@/views/Home.vue'
const routes = [
{ path: '/', component: Home }
]
const router = createRouter({
history: createWebHistory(),
routes
})
export default router
3.3.2. 在 Vue 中挂载路由
javascript
// main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
const app = createApp(App)
app.use(router)
app.mount('#app')
3.3.3. 路由导航组件
html
<!-- 使用 router-link 实现无刷新跳转 -->
<router-link to="/about">About</router-link>
<!-- 动态路由跳转 -->
<router-link :to="`/user/${userId}`">查看用户</router-link>
3.4. 🔄 路由和路由对象的使用场景
3.4.1. 路由对象 $route
javascript
// 在组件中访问路由信息
export default {
created() {
console.log(this.$route.path) // 当前路径
console.log(this.$route.params) // 动态参数
console.log(this.$route.query) // 查询参数
console.log(this.$route.meta) // 路由元信息
}
}
3.4.2. 路由实例 $router
javascript
// 程序化导航
this.$router.push({
name: 'UserDetails',
params: { id: 123 },
query: { sort: 'desc' }
})
// 前进/后退
this.$router.go(-1) // 后退一步
3.4.3. 路由守卫(导航守卫)
全局前置守卫
javascript
router.beforeEach((to, from, next) => {
if (to.meta.requiresAuth && !isAuthenticated) {
next('/login')
} else {
next()
}
})
组件内守卫
javascript
export default {
beforeRouteEnter(to, from, next) {
// 在渲染前验证权限
next(vm => {
// 访问组件实例
})
}
}
3.5. 💡 高级功能扩展
3.5.1. 路由懒加载
javascript
// 按需加载组件
const UserDetails = () => import('@/views/UserDetails.vue')
const routes = [
{
path: '/user/:id',
component: UserDetails
}
]
3.5.2. 路由元信息
javascript
// 定义元信息
{
path: '/admin',
component: AdminPanel,
meta: { requiresAuth: true }
}
// 全局守卫中使用
router.beforeEach((to, from, next) => {
if (to.meta.requiresAuth) {
// 验证权限
}
})
知识回顾
- 核心概念:
path
:路由路径component
:对应组件params
:动态参数(路径中)query
:查询参数(URL后?key=value
)
- 关键方法:
$router.push()
:跳转新路由$route.params
:获取动态参数
- 高级特性:
- 路由守卫控制权限
- 懒加载优化性能
- 路由元信息管理扩展属性
课后练习
单选:以下哪个属性用于定义路由的元信息?
- A.
path
- B.
meta
- C.
component
- D.
query
- A.
填空:动态路由参数通过______属性访问。
简答:为什么在 Vue Router 中推荐使用
router-link
而不是<a>
标签?
参考答案
- B
$route.params
router-link
避免页面刷新,提供更好的用户体验;支持路由高亮和动态参数传递。