一. 简介

1 什么是Vue-router

是一个vue官方出品的管理组件切换的插件

  • 管理组件切换
  • 是一个插件

    2 为什么需要Vue-router

    1) SPA应用

    首先, 我们要了解SPA的概念

    SPA(Single Page Application)单页应用

所有的内容都在同一个页面中渲染

2) SPA存在的问题

如何在一个页面中显示不同的内容呢?
技术方案: 使用锚链接

举例

我们看小说时, 都是在同一个页面, 借助锚链接实现同一页面的不同部分的跳转

第一章: http://localhost:5500/index.html#chap1
第二章: http://localhost:5500/index.html#chap2
image.png
#chap1, #chap2…这样的锚链接, 也叫做hash路由 也称为前端路由

3) 区分路由

  • 前端路由: 在同一个html页面, 显示不同的内容(组件). 进而建立了URL和组件之间的对应关系
  • 后端路由: 提供接口(数据)服务, 将不同请求方式+url, 映射到处理函数. 建立了URL和处理函数之间的对应关系

    二. 起步

    1 手动集成

    1) 安装

    1. npm install vue-router@3

    2) 创建路由文件

    /src/router/index.js

  • 安装vue-router插件

  • 定义路由规则
  • 导出路由对象

    示例

  1. // 一. 导入vue
  2. import Vue from 'vue'
  3. // 二. 导入vue-router
  4. import VueRouter from 'vue-router'
  5. // 三. 使用vue-router插件
  6. Vue.use(VueRouter)
  7. // 四. 实例化VueRouter对象
  8. // 4.1 new
  9. // 4.2 路由规则
  10. const routes = []
  11. const router = new VueRouter({
  12. routes: routes,
  13. })
  14. // 五. 导出router对象
  15. export default router

3) 导入路由对象

在main.js中导入路由对象

  1. // 导入路由对象
  2. import router from './router'
  3. new Vue({
  4. // 挂载
  5. router,
  6. render: (h) => h(App),
  7. }).$mount('#app')

2 配置路由规则

1) 创建页面级路由文件

src/views目录下, 创建两个路由文件

  • Todo.vue
  • Article.vue :::info 说明
  1. views目录: 存放页面级的组件
  2. components目录: 存放公共组件, 通用组件, 小组件 ::: ```vue
``` ```vue ``` ### 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 ``` ## 4 自动集成 如果使用`@Vue/cli`工具创建项目, 可以在构建项目时, 直接选择router ```powershell vue create project ``` ## 5 示例 :::warning **需求**
实现如下效果
![切换组件.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
  1. <a name="JvAll"></a>
  2. # 三. 路由对象与路由规则
  3. <a name="pQPXO"></a>
  4. ## 1 路由对象
  5. `$router`表示路由对象
  6. - 包含`路由规则对象`
  7. - 操作`路由规则对象`
  8. - 主要调用其方法
  9. - push
  10. - go
  11. - replace
  12. ![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)
  13. <a name="R3YKp"></a>
  14. ## 2 路由规则
  15. 路由对象上的`routes`数组, 构成了路由规则`$route`
  16. - 解析URL
  17. - 参数
  18. - query
  19. - 使用其属性
  20. ![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)
  21. <a name="Rox1y"></a>
  22. ## 3 动态路由参数
  23. 根据`路由规则`传参
  24. > 案例
  25. 获取user的id值
  26. <a name="kEBfQ"></a>
  27. ### 1) 创建user组件文件
  28. 创建`views/User.vue`文件, 编写如下内容
  29. ```vue
  30. <template>
  31. <div>获取到user的id: {{ $route.params.id }}</div>
  32. </template>
  33. <script>
  34. export default {
  35. name: 'User',
  36. }
  37. </script>
  38. <style>
  39. </style>

2) 配置路由规则

修改router/index.js

  1. // 一. 使用vue-router插件
  2. import Vue from 'vue'
  3. import VueRouter from 'vue-router'
  4. Vue.use(VueRouter)
  5. // 导入路由对象
  6. import Todo from '@/views/Todo'
  7. import Article from '@/views/Article'
  8. import User from '@/views/User'
  9. // 二. 定义路由规则(routes)
  10. const routes = [
  11. { path: '/todo', component: Todo },
  12. { path: '/article', component: Article },
  13. { path: '/user/:id', component: User },
  14. ]
  15. // 三. 创建路由对象(路由器router)
  16. const router = new VueRouter({
  17. routes: routes,
  18. })
  19. // 四. 导出路由对象
  20. export default router

示例

image.png

3) 编写路由的入口

修改App.vue

  1. <template>
  2. <div id="app">
  3. <a href="#/todo">显示Todo组件</a>
  4. <a href="#/article">显示Article组件</a>
  5. <a href="#/user/1">显示User组件, 传数据1</a>
  6. <!-- 定义一个路由出口: 在哪里显示子组件 -->
  7. <div class="page">
  8. <router-view></router-view>
  9. </div>
  10. </div>
  11. </template>
  12. <script>
  13. export default {
  14. name: 'App',
  15. mounted() {
  16. // $router: 路由器(路由对象). 操作route规则的, 调用push/go/replace方法
  17. console.log(this.$router)
  18. // $route: 路由规则. 操作URL的. 主要使用其属性(params, query)
  19. console.log(this.$route)
  20. },
  21. }
  22. </script>
  23. <style>
  24. a {
  25. padding: 0 10px;
  26. }
  27. .page {
  28. width: 400px;
  29. height: 100px;
  30. border: 1px solid #000;
  31. }
  32. </style>

四. router-link

1 介绍

1) 定义

vue-router插件实现的一个组件.

2) 作用

实现组件之间的切换

2 使用

router-link默认情况, 被渲染为a元素
可能通过指定tag属性, 渲染为任意元素

  1. <router-link to="/todo" tag="li">显示Todo组件</router-link>
  2. <router-link to="/article">显示Article组件</router-link>

渲染的DOM如下

  1. <li>显示Todo组件</li>
  2. <a href="#/article">显示Article组件</a>

五. 编程式导航

vue-router中, 除了

  • 使用router-link实现导航外
  • 还可以调用$router路由器的方法, 以js代码的方式进行导航

主要方法

  • push: 会将URL压入到History记录栈中, 可以通过浏览器前进``后退按钮进行操作
  • replace: 不会将URL压入到History记录栈中

示例

template部分

  1. <button @click="handleClick">导航到Todo组件</button>

script部分

  1. methods: {
  2. handleClick() {
  3. // 导航到/todo组件
  4. console.log(this.$route) // 保存当前的URL
  5. if (this.$route.path != '/todo') {
  6. this.$router.push('/todo')
  7. }
  8. },
  9. },