Vue Router是Vue.js的官方路由器。为了更轻易构建SAP单页应用(single page application)

多页面应用:有多个html文件,通过a标签的连接联通各个页面 缺点:

  • 开发起来太冗余,编译、压缩很耗时间
  • 页面之间的跳转速度慢,跳转间隙会出现白屏,用户体验差

单页面应用:

  • 解决多页面应用的问题。只有一个页面,无需刷新页面
  • 必须依靠路由来实现内容切换,app、后台管理系统主要的开发形式就是SPA

什么是路由

回顾——什么是路由
路由介绍

安装

使用路由需要安装插件

  • yarn

    $ yarn add vue-router@4 vue3中使用vue-router4的版本 $yarn add vue-router@3 vue2中使用vue-router3的版本

手动在 src 目录下新建 router 文件夹 在该文件夹内创建 index.ts

使用

src/router/index.ts

  1. // todo 1、从vue-router中结构出createRouter
  2. // 从vue-router中结构出createWebHistory表示使用history模式 首选
  3. // 从vue-router中结构出createWebHashHistory表示使用hash模式
  4. import {createRouter,createWebHistory,createWebHashHistory} from 'vue-router'
  5. // todo 2、创建路由实例并传递 `routes` 配置
  6. const router =createRouter({
  7. // history: 是用于选择路由的模式:
  8. history:createWebHistory(), // 这是使用 history 模式
  9. // routes: 路由表,用于确定一个路由对应一个组件 使得每个路由都需要映射到一个组件
  10. routes:[] // 在此处打造路由表
  11. })
  12. // todo 3、导出router实例
  13. export default router
  14. // 去main.ts激活组册

vue路由的模式:

hash 模式:#/home 兼容性强支持所有浏览器
原理:window.onhashchange = function () => {} // 监听url改变的
history 模式:/home 依赖 HTML5 History API和服务器配置,需要后端支持
原理:window.onpopstate = function () => {} / history API // 监听路由改变

scr/main.ts

入口文件main.ts中引入路由实例 router , 然后在根实例中注册

  1. import { createApp } from 'vue'
  2. import App from './App.vue'
  3. // 引入路由实例 router
  4. import router from './router'
  5. // 激活组册
  6. createApp(App).use(router).mount('#app')
  7. // createApp(App).mount('#app')

打造路由表(定义一些路由)

routes:[{path,component,meta,redirect,alias,children,beforeEnter}]

path 路由路径 /home
component 路由渲染的组件
meta 元数据 用于携带数据 比如做类似权限的功能
redirect 重定向
alias 别名
children 子路由表() /home/hot
beforeEnter 路由独享守卫,用于判断你是否有权限进入当前路由

在这里定义一些路由
  1. const routes = [
  2. {
  3. path: "/home",
  4. // 组件 在scr/page目录用于存放组件 home/index.vue
  5. // component后面跟着的组件需要使用路由懒加载,需要的时候才加载
  6. component: () =>
  7. import(/*webpackChunkName:"home"*/ "../page/home/index.vue"),
  8. name: "home", // 命名路由,给路由起个名字,通过名字快速找到该路由
  9. alias: "family",
  10. },
  11. {
  12. path: "/about",
  13. component: () =>
  14. import(/*webpackChunkName:'about'*/ "../page/about/index.vue"),
  15. name:'about'
  16. },
  17. ]

组件路由懒加载写法
  1. component: () => import(/*webpackChunkName:"home"*/ "../page/home/index.vue")

1、( ) => import() 表示vue的异步组件 需要的时候才加载,放入异步队列 2、/webpackChunkName/ webpack的代码分割功能 当一个组件很大的时候比较消化时间,将组件进行分割展示,给一个名字实现组件合并

捕获所有路由或 404 Not found 路由 (错误路由匹配)

注意⚠️:vue规定错误路由匹配必须放在最下面,它必须将上面的路由全找一遍,找不到才用当前这个。
常规参数只匹配 url 片段之间的字符,用 / 分隔。如果我们想匹配任意路径,我们可以使用自定义的 路径参数 正则表达式,在 路径参数 后面的括号中加入 正则表达式 :

  1. const roust = [{
  2. path: "/:pathMatch(.*)*",
  3. component: () => ,
  4. name: "NotFound"
  5. }]

404时界面公共内容控制
使用useRoute中的

  1. <script lang="ts">
  2. import { defineComponent,reactive,watch ,toRefs} from 'vue'
  3. import {useRoute} from 'vue-router' // vue-router中结构出useRoute
  4. export default defineComponent({
  5. setup() {
  6. const state=reactive({
  7. navFlag:true
  8. })
  9. const route=useRoute()
  10. watch(()=>route.path ,()=>{ // 监听路径的变化
  11. if(route.matched[0].path=='/:pathMatch(.*)*'){ // 匹配路径相等时触发
  12. state.navFlag=false
  13. }else{
  14. state.navFlag=true
  15. }
  16. })
  17. return {
  18. ...toRefs(state)
  19. }
  20. },
  21. })
  22. </script>

App.vue

利用内置内置组件实现路由切换,成为声明式页面跳转 还有一种命令式跳转会在动态路由中提及

  1. <template>
  2. <div>
  3. <h1>SPA</h1>
  4. <!-- 导航区域 -->
  5. <!-- router-link是vue-router提供的内置组件,用于声明式跳转页面 -->
  6. <!-- 通过传递'to'来指定连接 -->
  7. <!-- 通过'active-class="className"来指定选择时的样式' -->
  8. <div v-if="navFlag">
  9. <ul class="app-nav-list">
  10. <li>
  11. // active-class="className" 激活导航样式
  12. <router-link active-class="active" to="/home_1">Home</router-link>
  13. </li>
  14. <li>
  15. <router-link active-class="active" to="/about">about</router-link>
  16. </li>
  17. </ul>
  18. </div>
  19. <!-- 路由展示区域 (路由出口) -->
  20. <!-- 路由匹配到到组件将渲染在这里 -->
  21. <div class="app-router-content">
  22. <!-- router-view也是vue-router提供的内置组件,用于渲染路由对应的组件 -->
  23. <router-view></router-view>
  24. </div>
  25. </div>
  26. </template>
  27. <script>
  28. ...同上
  29. </script>
  30. <style lang="stylus">
  31. .app-nav-list
  32. width 500px
  33. display flex
  34. justify-content space-evenly
  35. .app-router-content
  36. margin-left 80px
  37. .active
  38. background red
  39. color white
  40. </style>

router-link

请注意,我们没有使用常规 a 标签,而是使用一个自定义组件 router-link 来创建链接。这使得Vue Router可以在不重新加载页面到情况下更新URL,处理URL到生成以及编码。

router-view

router-view 将显示与url对应的组件。你可以把它放在任何地方,以适应你的布局

Vue2 中 vue-router3 的使用

安装

$ yarn add vue-router@3

简单的使用

  1. // 该文件用于创建整个应用的路由器
  2. // 引入Vue
  3. import Vue from 'vue';
  4. // 引入vueRouter
  5. import VueRouter from 'vue-router';
  6. // 使用VueRouter插件
  7. Vue.use(VueRouter);
  8. // 引入路由组件
  9. import Home from '../components/Router-home';
  10. import About from '../components/Router-about';
  11. // 创建一个路由表
  12. const routes = [
  13. { path: '/home', component: Home },
  14. { path: '/about', component: About },
  15. ]
  16. // 创建并导出一个路由器
  17. export default new VueRouter({
  18. routes, // 是routes 不是 routers!!!!写错了不展示 也不报错 这个很坑的
  19. });
  1. import Vue from 'vue'
  2. import App from './App.vue'
  3. // 引入路由器
  4. import router from './router';
  5. console.log(router);
  6. Vue.config.productionTip = false;
  7. new Vue({
  8. render: h => h(App),
  9. // vue配置项中添加 router 项
  10. router, // 此时url从原来的 http://localhost:8080/ 变为 http://localhost:8080/#/
  11. }).$mount('#app')
  1. <template>
  2. <div>
  3. <h1>Vue Router Demo</h1>
  4. <div>
  5. <!-- vue中借助router-link标签实现路由的切换 -->
  6. <router-link active-class="pickOn" to="/home">home</router-link> &nbsp;
  7. <router-link active-class="pickOn" to="/about">about</router-link>
  8. </div>
  9. <div>
  10. <!-- 指定组件的呈现位置 -->
  11. <router-view></router-view>
  12. </div>
  13. </div>
  14. </template>