目錄
前言
#想法
代碼
无论你怎么刷新我都会留在当前页面
并且点击浏览器回退键,我会跳到之前页面,不会循环
首頁 web前端 js教程 vue如何解決addRoutes動態新增路由後刷新失效的問題

vue如何解決addRoutes動態新增路由後刷新失效的問題

Jul 09, 2018 pm 02:02 PM
vue-router vue.js

這篇文章主要介紹了關於vue如何解決addRoutes動態添加路由後刷新失效的問題,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

前言

某些場景下我們需要利用addRoutes動態添加路由,但是刷新後就會失效,前段時間專案裡剛好遇到了這個應用場景,所以就花時間研究了一下,做下分享跟記錄,說的不對的地方,請大家指正。
應用程式場景:使用者a登入系統,頁面上有個按鈕,點擊之後會動態加入路由並且跳轉,跳轉過去之後,使用者刷新後也會停留在目前頁面。不點這個按鈕,瀏覽器輸入位址,使用者會跳到404頁面

github:https://github.com/Mrblackant...
線上查看:http://an888.net/router/keepR...
vue如何解決addRoutes動態新增路由後刷新失效的問題

#想法

1.使用者點擊按鈕,用addRutes動態加入路由並跳轉,並把路由保存;
2.用戶在新跳轉的頁面,刷新時利用beforeEach進行攔截判斷,如果發現之前有保存路由,並且判斷新頁面只是刷新事件,再將之前保存的路由添加進來;

代碼

1.按鈕點擊,儲存路由並跳轉

(1).在router/index.js裡宣告一個數組,裡邊是一些固定的路由,比如你的登錄頁面、404等等
//router/index.js
export const constantRouterMap=[
    {
      path: '/',
      // name: 'HelloWorld',
      component: HelloWorld
    }
  ]
Vue.use(Router)
export default new Router({
  routes: constantRouterMap
})
登入後複製
(2).按鈕點擊,跳轉、保存路由;
注意,保存路由這一步驟,要做進要跳到的元件裡,這是為了防止在beforeEach攔截這邊產生死循環
添加路由需要兩點,一是path,二是component,你可以封裝成方法,看著就會簡潔一點,我這裡就不做了
記得要用concat方法連接,固定的路由和動態新加的路由,這樣瀏覽器回退的時候也能正常返回
//点击跳转
<template>
  <p>
    点击新增 动态路由: "secondRouter"
    <br>
    <el-button>新增动态路由</el-button>

  </p>
</template>

<script>
import router from &#39;vue-router&#39;
import {constantRouterMap} from &#39;@/router&#39;


export default {
  name: &#39;kk&#39;,
  mounted(){
  },
  data () {
    return {
      msg: &#39;Welcome to Your Vue.js App&#39;
    }
  },
  methods:{
    srouter(){
      let newRoutes=constantRouterMap.concat([{path:&#39;/secondRouter&#39;,
        component :resolve => require(["@/components/kk"], resolve )
      }])
      this.$router.addRoutes(newRoutes)
      this.$router.push({path:&#39;/secondRouter&#39;})
    }
  }
}
</script>

//跳转过去的component组件,xxx.vue
<template>
  <p>
    恭喜你,动态添加路由成功,浏览器的链接已经变化;

    </p>
<h3 id="无论你怎么刷新我都会留在当前页面">无论你怎么刷新我都会留在当前页面</h3>
    <h3 id="并且点击浏览器回退键-我会跳到之前页面-不会循环">并且点击浏览器回退键,我会跳到之前页面,不会循环</h3>

  
</template>

<script>
import router2 from &#39;@/router&#39;
import router from &#39;vue-router&#39;
export default {
  name: &#39;HelloWorld&#39;,
  mounted(){
      localStorage.setItem(&#39;new&#39;,JSON.stringify({&#39;path&#39;:&#39;/secondRouter&#39;,&#39;component&#39;:&#39;kk&#39;}))//保存路由
  },
  data () {
    return {
      msg: &#39;Welcome to Your Vue.js App&#39;
    }
  },
  methods:{
  }
}
</script>
登入後複製

2.路由攔截beforeEach

這裡攔截的時候,就判斷localStorage裡邊有沒有保存新的動態路由,如果有,就進行判斷,邏輯處理,處理完之後就把保存的路由清除掉,防止進入死循環。
進入第一層判斷後,需要再判斷一下是不是頁面的刷新事件
import router from './router'
import { constantRouterMap } from '@/router' //router里的固定路由
router.beforeEach((to, from, next) => {
  if (localStorage.getItem('new')) {
    var c = JSON.parse(localStorage.getItem('new')),
    lastUrl=getLastUrl(window.location.href,'/');

    if (c.path==lastUrl) { //动态路由页面的刷新事件
      let newRoutes = constantRouterMap.concat([{
        path: c.path,
        component: resolve => require(["@/components/" + c.component + ""], resolve)
      }])
      localStorage.removeItem('new')
      router.addRoutes(newRoutes)
      router.replace(c.path) //replace,保证浏览器回退的时候能直接返回到上个页面,不会叠加

    } 
  } 
  next()

})

var getLastUrl=(str,yourStr)=>str.slice(str.lastIndexOf(yourStr))//取到浏览器出现网址的最后"/"出现的后边的字符
登入後複製

ps:一開始我還以為匹配不到路由跳轉404要在攔截這裡處理,後來發現根本不用,直接在註冊路由的時候加上下邊兩段就行了:

export const constantRouterMap = [{
    path: '/',
    component: HelloWorld
  }, 
  {//404
    path: '/404',
    component: ErrPage
  },
  { //重定向到404
      path: '*', redirect: '/404' }
]
登入後複製

整體的思路大概就是這樣,主要就是利用了beforeEach攔截localStorage的數據存儲,就能完成,addRoutes動態新增路由刷新不失效功能。
不足的地方還請大家多多指正

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

vue router: dynamic route matching動態路由匹配

自製vue元件通訊外掛程式之用mixin寫入外掛程式

以上是vue如何解決addRoutes動態新增路由後刷新失效的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

圖文詳解如何在Vue專案中整合Ace程式碼編輯器 圖文詳解如何在Vue專案中整合Ace程式碼編輯器 Apr 24, 2023 am 10:52 AM

Ace 是一個用 JavaScript 寫的可嵌入程式碼編輯器。它與 Sublime、Vim 和 TextMate 等原生編輯器的功能和效能相符。它可以很容易地嵌入到任何網頁和 JavaScript 應用程式中。 Ace 被維護為Cloud9 IDE的主要編輯器 ,並且是 Mozilla Skywriter (Bespin) 專案的繼承者。

Vue應用程式中遇到vue-router的錯誤「NavigationDuplicated: Avoided redundant navigation to current location」 – 怎麼解決? Vue應用程式中遇到vue-router的錯誤「NavigationDuplicated: Avoided redundant navigation to current location」 – 怎麼解決? Jun 24, 2023 pm 02:20 PM

Vue應用程式中遇到vue-router的錯誤「NavigationDuplicated:Avoidedredundantnavigationtocurrentlocation」–怎麼解決? Vue.js作為快速且靈活的JavaScript框架在前端應用開發中越來越受歡迎。 VueRouter是Vue.js的一個程式碼庫,用來進行路由管理。然而,有時

探討如何在Vue3中撰寫單元測試 探討如何在Vue3中撰寫單元測試 Apr 25, 2023 pm 07:41 PM

在當今前端開發中,Vue.js 已經成為了一個非常流行的框架。隨著 Vue.js 的不斷發展,單元測試變得越來越重要。今天,我們將探討如何在 Vue.js 3 中編寫單元測試,並提供一些最佳實踐和常見的問題及解決方案。

Vue中JSX語法和模板語法的簡單比較(優劣勢分析) Vue中JSX語法和模板語法的簡單比較(優劣勢分析) Mar 23, 2023 pm 07:53 PM

在Vue.js中,開發人員可以使用兩種不同的語法來建立使用者介面:JSX語法和範本語法。這兩種文法各有優劣,以下就來探討它們的差異和優劣勢。

淺析vue怎麼實現檔案切片上傳 淺析vue怎麼實現檔案切片上傳 Mar 24, 2023 pm 07:40 PM

在實際開發專案過程中有時候需要上傳比較大的文件,然後呢,上傳的時候相對來說就會慢一些,so,後台可能會要求前端進行文件切片上傳,很簡單哈,就是把比如說1個G的檔案流切割成若干個小的檔案流,然後分別請求介面傳遞這個小的檔案流。

聊聊vue3怎麼使用高德地圖api 聊聊vue3怎麼使用高德地圖api Mar 09, 2023 pm 07:22 PM

在我們使用高德地圖的時候,官方給我們推薦了很多案例,demo,但是這些案例都是使用原生方法接入,並沒有提供vue或者react 的demo,vue2的接入網上也很多人都有寫過,以下這篇文章就來看看vue3怎麼使用常用的高德地圖api,希望對大家有幫助!

實例詳解vue3實現chatgpt的打字機效果 實例詳解vue3實現chatgpt的打字機效果 Apr 18, 2023 pm 03:40 PM

在做 chatgpt 鏡像站的時候,發現有些鏡像站是沒做打字機的遊標效果的,就只是文字輸出,是他們不想做嗎?反正我想做。於是我仔細研究了一下,實現了打字機效果加遊標的效果,現在分享一下我的解決方案以及效果圖~

手把手教你使用Vue3實作一個飄逸元素拖曳功能 手把手教你使用Vue3實作一個飄逸元素拖曳功能 Mar 30, 2023 pm 08:57 PM

怎麼實現元素拖曳功能?以下這篇文章一步一步帶大家了解如何使用Vue3實作一個飄逸元素拖曳功能,並在實例中了解相關知識點,希望對大家有幫助!

See all articles