芹菜是一根葱
专业解决各种前端Bug,吊打各种面试官

对于编程式导航 来说,重复单击会抛出NavigationDuplicated的警告错误.

编程式导航点击时可以正常跳转,双击就会报错

当前使用vue-router版本:

 

 

 报错原因:

编程式导航内部使用promise语法,需要路由跳转时有指定的回调函数,否则就会返回一个promise.

同时,内部会判断跳转的路径是否发生变化。

有变化     返回的promise实例状态:    成功

无变化     返回的promise实例状态:   失败,

 

解决:

方法1:跳转时指定成功和失败的回调函数

方法2:使用catch来处理错误

总结:只能解决部分的,不能解决所有编程式导航报错,推荐在原型上修改

方法3:在路由配置的index.js中:修改原型上的push\replace方法,解决重复跳转时报错 1 //在原型上修改push\replace方法,解决重复跳转时报错 2 // 1.1先将原型之前的push\replace存储到一个变量中

 3 const originPush = VueRouter.prototype.push
 4 const originReplace = VueRouter.prototype.replace
 5 
 6 // 1.2 修改原型上的push
 7 VueRouter.prototype.push = function (location, okCallback, errCallback) {
 8   // 如果没有传递这两个参数
 9   if (okCallback === undefined && errCallback === undefined) {
10     // 统一处理报错问题
11     originPush.call(this, location).catch(() => {})
12   } else {
13     originPush.call(this, location, okCallback, errCallback)
14   }
15 }
16 // 1.3 修改原型上的replace
17 VueRouter.prototype.replace = function (location, okCallback, errCallback) {
18 if (okCallback === undefined && errCallback === undefined) { 19 // 统一处理报错问题 20 originReplace.call(this, location).catch(() => {}) 21 } else { 22 originReplace.call(this, location, okCallback, errCallback) 23 } 24 }

编程式导航按钮注册事件:

1 methods:{
2     // 实现搜索按钮单击跳转 编程式导航 push在历史记录中添加一条可以回退
3     betSearch(){
4         this.$router.push('/search')
5     }
6 }

 

  

 
posted on 2022-07-11 20:37  芹菜是一根葱  阅读(560)  评论(0编辑  收藏  举报