vue-router升级后遇到的问题

前言

最近公司需要把项目从vue2升级到vue3,路由也从vue-router从3升级到4版本,这种跨版本升级,很多写法都变了,api很多也不一定兼容,所以项目的功能都要重新测一遍,有问题的就要修改。

正文

路由模式

之前vue router的路由模式是下面这种写法:

js 复制代码
import Router from 'vue-router'
new Router({
  mode: 'hash', // history,abstract等
  base: process.env.BASE_URL,  // 取自于`vue.config.js` 中的 `publicPath`字段,等同
  routes
})

通过mode字段定义路由模式,然后base字段是基准路径。

而新的vue router4则更改了写法,提供一个history字段,值有以下:

  • createWebHashHistory(base)
  • createWebHistory(base)
  • createMemoryHistory(base)

分别对应之前的hash,history,abstract模式。

然后base字段也去掉了,改成直接通过传参来代替。

js 复制代码
import { createRouter, createWebHashHistory } from 'vue-router'
const router = createRouter({
  history: createWebHashHistory(process.env.BASE_URL),
  routes
})

同时,不再采用new Router实例化,而是采用createRouter调用函数,同时还暴露出createWebHashHistory,createWebHistory等函数。

mixins的router钩子函数

以前我们的组件会在mixins里面调用router的钩子函数,比如beforeRouteUpdate钩子函数,它会在路由改变,组件复用的时候调用。

在项目中,我们会在这个beforeRouteUpdate钩子函数里更新最新的参数。

但是我们在新的vue-router4里面,发现无论参数怎么变,请求还是之前的参数,导致数据还是老数据。

排查一番,才发现是mixins的钩子函数并没有执行,导致参数不能及时更新,导致请求还是老数据。

按理说这个逻辑应该跟之前的router版本一致才对,不应该出现这样的问题。

去github一搜索,发现这个问题一直存在,到现在还没有解决。

github的issue如下:

官方的回应:

同时我们在vue-router的文档中也可以看到,在从vue2中迁移

解决方案

第一种:

我们可以在组件定义一个router钩子函数,然后里面是执行mixins对应的钩子函数,并把参数传过去,mixins那边的逻辑不用改。这样改动相对较小。

示例代码:

js 复制代码
  import mixinsjs from '@/mixins/mixinsjs'
  export default {
    mixins: [minxinjs],
    beforeRouteUpdate (to, from, next) {
        minxinjs.beforeRouteUpdate.apply(this, [to, from, next])
    }
  }

第二种:

如果你的mixins只有这些钩子函数的逻辑,而且组件上没有这些钩子,可以采用解构的方法。

js 复制代码
 import mixinsjs from '@/mixins/mixinsjs'
 export default {
    ...minxinjs, // 解构
    // rest component logic 
 }

注意: 解构的方式,组件的data和methods会覆盖掉minxins的data,和methods,请注意解构的mixins中只有钩子函数的逻辑。

第三种:

可以在mixins中,定义一个created函数 ,利用this.$route的钩子守卫函数,把mixins中的router钩子逻辑写在对应的位置。

js 复制代码
const mixinsjs =  {
  created () {
    const route = this.$route.matched[0]
    if (!route) return
    route.leaveGuards = [function (to, from, next) {
      // beforeRouteLeave 的逻辑写在这里
      next()
    }]
    route.beforeEnter = [function (to, from, next) {
      // beforeRouteEnter 的逻辑写在这里
      next()
    }]
    route.updateGuards = [function (to, from, next) {
      // beforeRouteUpdate 的逻辑写在这里
      next()
    }]
  }
}
export default mixinsjs

总结

以上就是我升级vue-router后遇到的问题,vue-router这种跨大版本的升级,肯定会存在很多兼容问题,大家先评估改动的成本,再决定是否升级。

相关推荐
森林的尽头是阳光2 小时前
tree回显问题
javascript·vue.js·elementui
weixin_BYSJ19872 小时前
「课设设计」springboot校园超市助购系统26449 (附源码)
java·javascript·spring boot·python·django·flask·php
qetfw3 小时前
MWU:Vue 3 + FastAPI 的 MaaFramework 跨平台 WebUI 源码
前端·vue.js·python·fastapi·开源项目·效率工具
mfxcyh3 小时前
Vue3+Ant Design Vue 实现手动异步文件上传(含大小校验、弹窗上传)
前端·javascript·vue.js
meilindehuzi_a3 小时前
Vue3进阶基础:指令修饰符、v-model表单绑定、动态样式、计算属性与侦听器实战
前端·javascript·vue.js
csdn2015_4 小时前
vue 前端运行命令
前端·javascript·vue.js
Cobyte4 小时前
根据浏览器解析 HTML 的规范实现 HTML 解析器
前端·javascript·vue.js
用户83134859306984 小时前
Cesium 实现行政区反向遮罩镂空效果(自定义暗色蒙层+矢量/影像底图切换)
vue.js·webgl·cesium
默_笙4 小时前
😁 LLM 不知道的事它不会说"不知道",而是会"编"——RAG 就是让它闭嘴先查资料
前端·javascript
Revolution614 小时前
变量提升到底提升了什么:为什么 var 是 undefined,let 却直接报错
前端·javascript