文章目录
-
- 一、路由的核心定义与基础使用
-
- [1. 路由是什么?](#1. 路由是什么?)
- [2. 路由使用的完整步骤](#2. 路由使用的完整步骤)
-
- [步骤1:安装 Vue Router](#步骤1:安装 Vue Router)
- [步骤2:配置 main.ts(入口文件)](#步骤2:配置 main.ts(入口文件))
- 步骤3:创建路由配置文件(router/index.ts)
- [步骤4:创建视图组件(views 目录)](#步骤4:创建视图组件(views 目录))
- [步骤5:在 App.vue 中使用路由](#步骤5:在 App.vue 中使用路由)
- [二、路由的两种模式:history vs hash](#二、路由的两种模式:history vs hash)
- 三、路由跳转的进阶写法
-
- [1. `<router-link>` 的两种写法](#1.
<router-link>的两种写法) - [2. 命名路由:简化跳转路径](#2. 命名路由:简化跳转路径)
- [1. `<router-link>` 的两种写法](#1.
- 四、嵌套路由:实现页面层级嵌套
- [五、路由传参:query vs params](#五、路由传参:query vs params)
- [六、编程式导航:JS 控制路由跳转](#六、编程式导航:JS 控制路由跳转)
- [七、重定向:URL 跳转的"快捷方式"](#七、重定向:URL 跳转的“快捷方式”)
- [八、易混淆点:route vs router](#八、易混淆点:route vs router)
- 总结
一、路由的核心定义与基础使用
1. 路由是什么?
核心逻辑链 :用户访问 URL → 路由匹配 URL 与组件的映射关系 → 渲染对应组件 → 实现页面无刷新切换。
简单来说,路由就是"URL 与页面组件的匹配器",这也是 SPA 应用的核心特性------通过改变 URL 路径,不重新请求页面,只替换页面中的组件内容。
2. 路由使用的完整步骤
想要在 Vue 项目中使用路由,需遵循以下标准化流程:
步骤1:安装 Vue Router
bash
npm install vue-router@4 # Vue3 对应版本
步骤2:配置 main.ts(入口文件)
引入并挂载路由实例,让整个应用具备路由能力:
typescript
import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index.ts' // 引入路由配置
const app = createApp(App)
app.use(router) // 挂载路由
app.mount('#app')
步骤3:创建路由配置文件(router/index.ts)
在 router 目录下新建 index.ts,用于配置"URL-组件"的映射表(路由表):
typescript
import { createRouter, createWebHistory, createWebHashHistory } from 'vue-router'
import Home from '../views/Home.vue'
// 路由表配置
const routes = [
{
path: '/home', // URL 路径
component: Home // 匹配的组件
}
]
// 创建路由实例:可选 history 或 hash 模式
const router = createRouter({
history: createWebHistory(), // history模式(无#)
// history: createWebHashHistory(), // hash模式(带#)
routes
})
export default router
步骤4:创建视图组件(views 目录)
在 views 目录下新建页面组件(如 Home.vue),内容可自定义:
vue
<template>
<div>
<h1>首页</h1>
</div>
</template>
步骤5:在 App.vue 中使用路由
通过 <router-link> 实现跳转(替代 a 标签),<router-view> 作为组件渲染容器:
vue
<template>
<div>
<!-- 路由跳转链接 -->
<router-link to="/home">进入首页</router-link>
<!-- 匹配的组件将渲染在这里 -->
<router-view></router-view>
</div>
</template>
二、路由的两种模式:history vs hash
核心逻辑链 :模式选择 → URL 格式 → 兼容性/部署要求 → 最终体验。
Vue Router 提供两种路由模式,核心差异在于 URL 格式和部署要求:
| 模式 | URL 特征 | 优点 | 缺点 |
|---|---|---|---|
| history 模式 | 无 #(如 /home) | URL 美观,接近传统网站 | 上线需服务端配置(Nginx/Apache),否则刷新 404 |
| hash 模式 | 带 #(如 #/home) | 兼容性好,无需服务端配置 | URL 不美观,SEO 优化效果差 |
选择建议:开发环境可随意,生产环境若有服务端运维支持,优先选 history 模式;无服务端支持则用 hash 模式。
三、路由跳转的进阶写法
1. <router-link> 的两种写法
<router-link> 是路由跳转的核心标签,支持字符串和对象两种写法:
vue
<!-- 字符串写法(简单场景) -->
<router-link to="/home">首页</router-link>
<!-- 对象写法(灵活传参/动态路径) -->
<router-link :to="{ path: '/home' }">首页</router-link>
2. 命名路由:简化跳转路径
核心逻辑链 :给路由命名 → 跳转时用 name 替代 path → 降低路径维护成本。
当路由路径较长时,可给路由配置 name,跳转时直接用 name 匹配,避免手写长路径:
typescript
// 路由表中配置 name
const routes = [
{
name: 'zhuye', // 路由名称
path: '/home',
component: Home
}
]
// 跳转时使用 name(对象写法)
<router-link :to="{ name: 'zhuye' }">首页</router-link>
四、嵌套路由:实现页面层级嵌套
核心逻辑链 :父路由配置 children → 子路由路径区分绝对/相对 → 父组件预留 <router-view> → 渲染子组件。
实际开发中,页面往往有层级(如"首页-个人中心-设置"),嵌套路由可实现这种层级关系:
关键注意点
- 子路由需配置在父路由的
children数组中; - 子路由
path:带/是绝对路径(从根域名开始),不带/是相对路径(拼接在父路由 path 后); - 父组件中必须预留
<router-view>,用于渲染子组件。
示例代码
typescript
// 路由表配置嵌套路由
const routes = [
{
path: '/home',
component: Home,
// 子路由配置
children: [
// 相对路径:最终路径为 /home/profile
{ path: 'profile', component: () => import('../views/Profile.vue') },
// 绝对路径:最终路径为 /setting
{ path: '/setting', component: () => import('../views/Setting.vue') }
]
}
]
vue
<!-- Home.vue(父组件):预留子路由渲染容器 -->
<template>
<div>
<h1>首页</h1>
<router-link to="/home/profile">个人中心</router-link>
<router-view></router-view> <!-- 子组件渲染在这里 -->
</div>
</template>
五、路由传参:query vs params
核心逻辑链 :确定传参类型 → 配置路由规则 → 跳转时携带参数 → 目标组件获取参数。
开发中常需跳转时传递数据(如新闻 ID、用户信息),Vue Router 支持两种传参方式:
1. query 参数(路径拼接,如 ?a=1&b=2)
- 特点:参数拼接在 URL 后,无需提前占位,刷新页面参数不丢失;
- 适用场景:非核心参数(如筛选条件、分页信息)。
步骤示例
vue
<!-- 1. 跳转并携带 query 参数 -->
<router-link :to="`/news/detail?Id=${news.id}&title=${news.title}`">
{{ news.title }}
</router-link>
<!-- 或对象写法 -->
<router-link :to="{
path: '/news/detail',
query: { Id: news.id, title: news.title }
}">
{{ news.title }}
</router-link>
<!-- 2. 目标组件获取 query 参数 -->
<script setup>
import { useRoute } from 'vue-router'
const route = useRoute()
console.log(route.query) // { Id: '1', title: '新闻标题' }
</script>
2. params 参数(路径占位,如 /detail/1)
- 特点:参数嵌入 URL 中,需提前在路由表占位,刷新页面参数不丢失;
- 适用场景:核心参数(如商品 ID、用户 ID)。
步骤示例
typescript
// 1. 路由表中提前占位
const routes = [
{
name: 'newsDetail', // 必须配置 name(对象写法跳转时用)
path: '/news/detail/:Id/:title', // 占位符
component: () => import('../views/NewsDetail.vue')
}
]
vue
<!-- 2. 跳转并携带 params 参数 -->
<!-- 字符串写法 -->
<router-link :to="`/news/detail/${news.id}/${news.title}`">
{{ news.title }}
</router-link>
<!-- 对象写法(必须用 name,不能用 path) -->
<router-link :to="{
name: 'newsDetail',
params: { Id: news.id, title: news.title }
}">
{{ news.title }}
</router-link>
<!-- 3. 目标组件获取 params 参数 -->
<script setup>
import { useRoute } from 'vue-router'
const route = useRoute()
console.log(route.params) // { Id: '1', title: '新闻标题' }
</script>
六、编程式导航:JS 控制路由跳转
核心逻辑链 :场景触发(按钮/登录)→ 引入 useRouter → 创建实例 → 调用跳转方法。
<router-link> 仅适用于点击跳转,若需通过 JS 控制(如按钮点击、登录成功后跳转),需用编程式导航:
核心方法
| 方法 | 作用 | 特点 |
|---|---|---|
router.push(path) |
跳转页面 | 保留历史记录(可返回) |
router.replace(path) |
重定向 | 不保留历史记录(不可返回) |
router.go(n) |
前进/后退 n 步 | router.go(-1) 等价返回上一页 |
示例代码
vue
<template>
<button @click="goNews">跳转到新闻页</button>
<button @click="goBack">返回上一页</button>
</template>
<script setup>
import { useRouter } from 'vue-router'
const router = useRouter()
// 跳转新闻页(带 query 参数)
const goNews = () => {
router.push({
path: '/news',
query: { type: 'hot' }
})
}
// 返回上一页
const goBack = () => {
router.go(-1)
}
</script>
七、重定向:URL 跳转的"快捷方式"
核心逻辑链 :访问旧 URL → 路由匹配重定向规则 → 自动跳转到新 URL → 渲染目标组件。
重定向用于将一个 URL 映射到另一个 URL,比如访问 / 自动跳转到 /home:
typescript
const routes = [
{
path: '/',
redirect: '/home' // 重定向到 /home
},
{
path: '/home',
component: Home
}
]
八、易混淆点:route vs router
很多开发者会混淆 route 和 router,核心区别如下:
| 名称 | 含义 | 核心作用 |
|---|---|---|
router |
路由实例(全局) | 控制路由跳转(push/replace) |
route |
当前路由信息(局部) | 获取路由参数(query/params) |
使用示例:
vue
<script setup>
import { useRouter, useRoute } from 'vue-router'
const router = useRouter() // 跳转用
const route = useRoute() // 获取参数用
// 跳转
const goToHome = () => router.push('/home')
// 获取参数
console.log(route.query) // 当前页面的 query 参数
</script>
总结
Vue Router 是 Vue 生态的核心部分,掌握它的关键在于理解"URL-组件"的匹配逻辑,再逐步拆解模式、跳转、传参、嵌套等进阶知识点。核心逻辑链可总结为:
配置路由表 → 选择跳转方式 → 处理参数传递 → 适配部署场景。
从基础的路由配置到进阶的编程式导航、嵌套路由,每一步都围绕"无刷新切换组件"的核心目标。掌握这些知识点后,就能灵活应对 SPA 应用中的各种页面跳转和数据传递场景。