vue跳轉同一路由報錯的問題及解決

vue跳轉同一路由報錯

vue中,如果跳轉同一個頁面路由,雖不會影響功能,但是會報錯

原因:路由的push會向歷史記錄棧中添加一個記錄,同時跳轉同一個路由頁面,會造成一個重復的添加,導致頁面的報錯

解決方案:在router的index.js中重寫vue的路由跳轉push

const originalPush = Router.prototype.push
Router.prototype.push = function push(location) {
	return originalPush.call(this, location).catch(err => err);
}

編程式路由跳轉多次點擊報錯問題

使用編程式路由進行跳轉時,控制臺報錯,如下所示。

問題分析

該問題存在於Vue-router v3.0之後的版本,由於新加入的同一路徑跳轉錯誤異常功能導致。

解決方法

重寫 $router.push$router.replace 方法,添加異常處理。

//push
const VueRouterPush = VueRouter.prototype.push
VueRouter.prototype.push = function push (to) {
  return VueRouterPush.call(this, to).catch(err => err)
}

//replace
const VueRouterReplace = VueRouter.prototype.replace
VueRouter.prototype.replace = function replace (to) {
  return VueRouterReplace.call(this, to).catch(err => err)
}

示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue 編程式路由跳轉多次點擊報錯問題</title>
</head>
<body>
    <div id="app">
        <button @click="pageFirst">Page First</button>
        <button @click="pageSecond">Page Second</button>
        <router-view></router-view>
    </div> 

    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
    <script>
        const First = { template: '<div>First Page</div>' } //調用路由name屬性
        const Second = { template: '<div>Second Page</div>' }
        routes = [
            { path:'/first', name:"first" ,component: First },  //設置路由name屬性
            { path: '/second', name:"second", component: Second }
        ]
        router = new VueRouter({
            routes
        })

        //push
        const VueRouterPush = VueRouter.prototype.push
        VueRouter.prototype.push = function push (to) {
            return VueRouterPush.call(this, to).catch(err => err)
        }

        //replace
        const VueRouterReplace = VueRouter.prototype.replace
        VueRouter.prototype.replace = function replace (to) {
            return VueRouterReplace.call(this, to).catch(err => err)
        }

        const app = new Vue({
            router,
            methods: {
                pageFirst(){ router.push('/first') },
                pageSecond(){ router.push({ name: 'second' }) },
            },
        }).$mount('#app')
    </script>
</body>
</html>

總結

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: