一. 简介
1 什么是Vue-router
是一个vue官方出品的管理组件切换的插件
2) SPA存在的问题
如何在一个页面中显示不同的内容呢?
技术方案: 使用锚链接
举例
我们看小说时, 都是在同一个页面, 借助锚链接
实现同一页面的不同部分的跳转
第一章: http://localhost:5500/index.html#chap1
第二章: http://localhost:5500/index.html#chap2
像#chap1
, #chap2
…这样的锚链接, 也叫做hash路由
也称为前端路由
3) 区分路由
- 前端路由: 在同一个html页面, 显示不同的内容(组件). 进而建立了URL和组件之间的对应关系
后端路由: 提供接口(数据)服务, 将不同请求方式+url, 映射到处理函数. 建立了URL和处理函数之间的对应关系
二. 起步
1 手动集成
1) 安装
npm install vue-router@3
2) 创建路由文件
/src/router/index.js
安装
vue-router
插件- 定义路由规则
- 导出路由对象
示例
// 一. 导入vue
import Vue from 'vue'
// 二. 导入vue-router
import VueRouter from 'vue-router'
// 三. 使用vue-router插件
Vue.use(VueRouter)
// 四. 实例化VueRouter对象
// 4.1 new
// 4.2 路由规则
const routes = []
const router = new VueRouter({
routes: routes,
})
// 五. 导出router对象
export default router
3) 导入路由对象
在main.js中导入路由对象
// 导入路由对象
import router from './router'
new Vue({
// 挂载
router,
render: (h) => h(App),
}).$mount('#app')
2 配置路由规则
1) 创建页面级路由文件
在src/views
目录下, 创建两个路由文件
- Todo.vue
- Article.vue :::info 说明
- views目录: 存放页面级的组件
- components目录: 存放公共组件, 通用组件, 小组件
:::
```vue
todo页面
文章页面
```
### 2) 导入页面组件
在`router/index.js`文件中, 导入组件
```javascript
// 导入路由对象
import Todo from '@/views/Todo'
import Article from '@/views/Article'
```
### 3) 编写路由规则
:::info
**核心**建立URL和组件之前的对应关系 ::: ```javascript const routes = [ { path: '/todo', component: Todo }, { path: '/article', component: Article }, ] ``` ## 3 配置路由出口 在app.vue中, 通过设置`router-view`显示不同的组件 ```html
实现如下效果
![切换组件.gif](https://cdn.nlark.com/yuque/0/2022/gif/25807822/1650435020995-e5b3b680-98aa-4204-b1cf-93ec4502dcea.gif#clientId=u0177b11f-85f0-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=219&id=u0239fa60&margin=%5Bobject%20Object%5D&name=%E5%88%87%E6%8D%A2%E7%BB%84%E4%BB%B6.gif&originHeight=328&originWidth=694&originalType=binary&ratio=1&rotation=0&showTitle=false&size=38657&status=done&style=none&taskId=u01930f47-f948-49d2-b16b-035a8980cf9&title=&width=462.6666666666667) ::: > 参考答案 ```vue
<a name="JvAll"></a>
# 三. 路由对象与路由规则
<a name="pQPXO"></a>
## 1 路由对象
`$router`表示路由对象
- 包含`路由规则对象`
- 操作`路由规则对象`
- 主要调用其方法
- push
- go
- replace
![image.png](https://cdn.nlark.com/yuque/0/2022/png/25807822/1650436180029-5bc6c31d-4083-46f2-b0af-c85f41d9e784.png#clientId=ucdec4935-9194-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=421&id=udeb3e7d3&margin=%5Bobject%20Object%5D&name=image.png&originHeight=631&originWidth=1105&originalType=binary&ratio=1&rotation=0&showTitle=false&size=118757&status=done&style=none&taskId=u4a26869f-cac9-4d01-be02-7daed41d3da&title=&width=736.6666666666666)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/25807822/1650436274453-f75e0aef-00e9-4f3a-8b93-412592aa4672.png#clientId=ucdec4935-9194-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=421&id=uf4f74ff1&margin=%5Bobject%20Object%5D&name=image.png&originHeight=632&originWidth=990&originalType=binary&ratio=1&rotation=0&showTitle=false&size=138080&status=done&style=none&taskId=u8e2f69bc-84ab-4c3c-bb43-682dc2547a5&title=&width=660)
<a name="R3YKp"></a>
## 2 路由规则
路由对象上的`routes`数组, 构成了路由规则`$route`
- 解析URL
- 参数
- query
- 使用其属性
![image.png](https://cdn.nlark.com/yuque/0/2022/png/25807822/1650436368264-79037746-d5d0-4e5d-a1b5-930514f141b4.png#clientId=ucdec4935-9194-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=223&id=ue228f150&margin=%5Bobject%20Object%5D&name=image.png&originHeight=335&originWidth=1117&originalType=binary&ratio=1&rotation=0&showTitle=false&size=40642&status=done&style=none&taskId=uedb165c8-f458-4143-9bf2-8a4084d0eb5&title=&width=744.6666666666666)<br />对应于`router/index.js`中定义的路由规则<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/25807822/1650436399738-531baed2-9f6a-425a-8732-de576cfa49b6.png#clientId=ucdec4935-9194-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=147&id=u169fe6a5&margin=%5Bobject%20Object%5D&name=image.png&originHeight=221&originWidth=965&originalType=binary&ratio=1&rotation=0&showTitle=false&size=33001&status=done&style=none&taskId=u0306a97d-5508-408f-817d-35694b1af97&title=&width=643.3333333333334)
<a name="Rox1y"></a>
## 3 动态路由参数
根据`路由规则`传参
> 案例
获取user的id值
<a name="kEBfQ"></a>
### 1) 创建user组件文件
创建`views/User.vue`文件, 编写如下内容
```vue
<template>
<div>获取到user的id: {{ $route.params.id }}</div>
</template>
<script>
export default {
name: 'User',
}
</script>
<style>
</style>
2) 配置路由规则
修改router/index.js
// 一. 使用vue-router插件
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
// 导入路由对象
import Todo from '@/views/Todo'
import Article from '@/views/Article'
import User from '@/views/User'
// 二. 定义路由规则(routes)
const routes = [
{ path: '/todo', component: Todo },
{ path: '/article', component: Article },
{ path: '/user/:id', component: User },
]
// 三. 创建路由对象(路由器router)
const router = new VueRouter({
routes: routes,
})
// 四. 导出路由对象
export default router
示例
3) 编写路由的入口
修改App.vue
<template>
<div id="app">
<a href="#/todo">显示Todo组件</a>
<a href="#/article">显示Article组件</a>
<a href="#/user/1">显示User组件, 传数据1</a>
<!-- 定义一个路由出口: 在哪里显示子组件 -->
<div class="page">
<router-view></router-view>
</div>
</div>
</template>
<script>
export default {
name: 'App',
mounted() {
// $router: 路由器(路由对象). 操作route规则的, 调用push/go/replace方法
console.log(this.$router)
// $route: 路由规则. 操作URL的. 主要使用其属性(params, query)
console.log(this.$route)
},
}
</script>
<style>
a {
padding: 0 10px;
}
.page {
width: 400px;
height: 100px;
border: 1px solid #000;
}
</style>
四. router-link
1 介绍
1) 定义
由vue-router
插件实现的一个组件.
2) 作用
实现组件之间的切换
2 使用
router-link
默认情况, 被渲染为a
元素
可能通过指定tag
属性, 渲染为任意元素
<router-link to="/todo" tag="li">显示Todo组件</router-link>
<router-link to="/article">显示Article组件</router-link>
渲染的DOM如下
<li>显示Todo组件</li>
<a href="#/article">显示Article组件</a>
五. 编程式导航
在vue-router
中, 除了
- 使用
router-link
实现导航外 - 还可以调用
$router
路由器的方法, 以js代码的方式进行导航
主要方法
- push: 会将URL压入到History记录栈中, 可以通过浏览器
前进``后退
按钮进行操作 - replace: 不会将URL压入到History记录栈中
示例
template部分
<button @click="handleClick">导航到Todo组件</button>
script部分
methods: {
handleClick() {
// 导航到/todo组件
console.log(this.$route) // 保存当前的URL
if (this.$route.path != '/todo') {
this.$router.push('/todo')
}
},
},