报错提示
执行多次就会抛出NavigationDuplicated
原因
- 项目中所使用的vue-router最新版,已经引入了promise,promise需要传成功或失败的才可以解决掉;
- push是原型上的,非自己的,若要修改需要从原型下手。
【组件实例身上的$router
属性就是VueRouter
类的一个实例;
而VueRouter
类的实例可以借用原型对象上的方法;所以,当 this.$router
去.push
方法时,这个函数的上下文是VueRouter
类的实例】
解决办法
- 在router的index.js文件中重写:当路由组件调用push方法,需要传参,第一个参数
location
是指引原来的push往哪里跳; - 后面就是传成功或失败的参数(promise);
- 注意:编程式导航(push|replace)才会有这种情况的异常,声明式导航是没有这种问题,因为声明式导航内部已经解决这种问题。
//先把VueRouter原型对象上的push保存一份
let originPush = VueRouter.prototype.push;
//重写
VueRouter.prototype.push = function (location, resolve, reject) {
if (resolve && reject) {
originPush.call(this, location, resolve, reject)
} else {
originPush.call(this, location, () => { }, () => { })}
}