註意:編程式導航(push|replace)才會有這種情況的異常,聲明式導航是沒有這種問題,因為聲明式導航內部已經解決這種問題。 這種異常,對於程式沒有任何影響的。 為什麼會出現這種現象: 由於vue-router最新版本3.5.2,引入了promise,當傳遞參數多次且重覆,會拋出異常,因此出現上 ...
註意:編程式導航(push|replace)才會有這種情況的異常,聲明式導航是沒有這種問題,因為聲明式導航內部已經解決這種問題。
這種異常,對於程式沒有任何影響的。
為什麼會出現這種現象:
由於vue-router最新版本3.5.2,引入了promise,當傳遞參數多次且重覆,會拋出異常,因此出現上面現象,
第一種解決方案
//是給push函數,傳入相應的成功的回調與失敗的回調,可以捕獲到當前的錯誤,可以解決。
this.$router.push(
{
name: "search",
// path: "/search",
params: {
keyword: this.keyword,
},
query: {
k: this.keyword.toUpperCase(),
},
},
() => {}, //在這裡傳入成功的回調
() => {} //在這裡傳入失敗的回調
);
//第一種解決方案可以暫時解決當前問題,但是以後再用push|replace還是會出現類似現象,因此我們需要從‘根’治病;
第二種解決方案
//重寫push和replace方法,在我們的router/index.js下
//重寫push和replace方法
//先將VueRouter原型上的push和replace方法備份一份
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace
//重寫
//第一個參數,告訴原來push方法你要往哪裡跳轉(傳遞那些參數)
//第二個參數:成功的回調
//第三個參數:失敗的回調
//call和apply的區別
//相同點:都可以調用函數一次,都可以改變函數的this
//不同點:傳遞多個參數時,call傳遞參數用逗號隔開,apply傳遞一個數組
VueRouter.prototype.push = function (location, resolve, reject) {
if (resolve && reject) {
originPush.call(this, location, resolve, reject)
} else {
originPush.call(this, location, () => { }, () => { })
}
}
VueRouter.prototype.replace = function (location, resolve, reject) {
if (resolve && reject) {
originReplace.call(this, location, resolve, reject)
} else {
originReplace.call(this, location, () => { }, () => { })
}
}
//這樣就可以根治掉這個問題了
重寫push和replace方法,我們需要瞭解
this是當前的組件實例對象,當我們在入口文件註冊路由VueRouter的時候,會給組件實例添加兩個屬性,一個$route和$router。
$router:這個屬性,屬性值是VueRouter的一個實例對象,他的身上並沒有push方法,push方法是VueRouter原型對象上的一個方法,它是借用的VueRouter原型上的push方法
$router是通過new VueRouter 出來的
function VueRouter(){
}
push方法是VueRouter原型對象上的一個方法
VueRouter.prototype.push = function({
//函數的this是VueRouter的一個實例對象
})