//先把VueRouter原型对象的push,先保存一份
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace
//重写push|replace
//第一个参数,告诉原来的push方法,你往哪里跳转(传递哪些参数)
//第二个函数,成功回调
//第三个参数,失败回调
VueRouter.prototype.push = function (location, resolve, reject) {
if (resolve && reject) {
//call || apply区别
//相同点: 都可以调用一次,都可以篡改函数的上下文一次
//不同点: call与apply传递参数: call传递参数用逗号隔开,apply方法执行,传递数组
//关键点就在于,originPush一定要把上下文改回原本的vm.$router实例
//VueRouter(构造函数的this指向自己的实例对象)的this指向vm.$router实例
//通过.call方法改变this指向(从window到vm.$router)
originPush.call(this, location, resolve, reject)
} else {
originPush.call(this, location, () => {},()=>{})
}
}
VueRouter.prototype.replace = function (location, resolve, reject) {
if (resolve && reject) {
//call || apply区别
//相同点: 都可以调用一次,都可以篡改函数的上下文一次
//不同点: call与apply传递参数: call传递参数用逗号隔开,apply方法执行,传递数组
//关键点就在于,originPush一定要把上下文改回原本的vm.$router实例
//VueRouter(构造函数的this指向自己的实例对象)的this指向vm.$router实例
//通过.call方法改变this指向(从window到vm.$router)
originReplace.call(this, location, resolve, reject)
} else {
originReplace.call(this, location, () => {},()=>{})
}
}
路由重写push和replace方法
于 2023-03-07 14:21:40 首次发布