邂逅Vue-Router

144 阅读3分钟

Vue-Router

官网:router.vuejs.org/zh/

1. 前端路由发展历程

  • 后端路由:当我们页面中需要请求不同的路径内容时,交给服务器来处理,服务器渲染好页面,并且将页面返回给客户端

  • 前后端分离:后端只提供api来返回数据,前端通过ajax获取数据,并且通过JS将数据渲染到页面

  • 单页面富应用

    • SPA: single page web application(在前后端分离的基础上加了一层路由)

    • 前端路由:由前端来维护关系,在不同的url显示不同的组件 核心:改变url,但是页面不进行整体的刷新 本质:监听url的变化

2. 改变URL, 页面不刷新的两种模式

  • hash模式
  • history模式

3. Vue-Router的使用过程

  • 安装:

    • npm install vue-router
  • 使用:

image.png

image.png

image.png

image.png

结果展示:

image.png

4. Vue-Router知识点补充

4.1. 默认路径

  • path -> redirect

4.2. history模式

  • createWebHistory()

4.3. router-link其他属性

  • to
  • replace
  • active-class
  • exact-active-class

4.4. 路由懒加载-分包处理

  • 当打包构建应用时,JavaScript 包会变得非常大,影响页面加载:

    • 如果能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就会更加高效,也可以提高首屏的渲染效率;
  • 其实就是webpack的分包知识,而Vue Router默认就支持动态来导入组件:

    • 这是因为component可以传入一个组件,也可以接收一个函数,该函数需要放回一个Promise,而import函数就是返回一个Promise;

image.png

5. 动态路由使用

path: /user/:id

image.png

image.png

image.png 结果展示

image.png

6. NotFound页面匹配

path: /:pathMatch(.*)
path: /:pathMatch(.*)*
它们的区别在于解析的时候,是否解析 /

image.png

image.png

image.png

7. 路由的嵌套使用

1.在一层路由中添加 children属性:

{ path: "recommend", component: () => import("../views/homerecomend.vue") }

2.在Home组件中添加 <router-view>
路径跳转可添加 <router-link>

image.png

image.png

8. 编程式导航

8.1. 跳转的方式

  • 页面跳转push():
//点击按钮完成跳转
 this.$router.push('/about')

//也可传入一个对象
   this.$router.push({ 
   path:'/about'
   query:{
   name:'xiaocaiji',
   age:18
   }
   })
  • 替换页面操作:replace()

使用push的特点是压入一个新的页面,那么在用户点击返回时,上一个页面还可以回退,但是如果我们希望当前页面是一个替换操作,那么可以使用replace

声明式:<router-link :to='...' replace>
编程式:router.replace(...)

  • 若是在setup中编写代码,如下图所示,通过useRouter来获取 image.png

image.png

8.2. 路径的切换

router.back()
router.forward()
router.go(number)

10 动态管理路由

10.1 什么情况下需要动态管理路由

  • 前端都会开发哪些项目;
  • 后台管理系统

10.2 动态添加路由

  • router.addRoute({})
  • router.addRoute("name", {})

image.png

10.3 管理路由别的方法

  • 移除路由的三种方式
  1. 添加一个name相同的路由;
  2. 通过removeRoute方法,传入路由的名称
  3. 通过addRoute方法的返回值回调;

image.png

检查路由是否存在:router.hasRoute()

获取一个包含所有路由记录的数组router.getRoutes()

11. 路由导航守卫

image.png

11.1 beforeEach

image.png

image.png

11.2 路由导航的流程解析

image.png

12.VSCode的模板的警告解除

若template有波浪线警告,可在jsconfig.json中添加 "jsx":"preserve"