vue如何解決addRoutes動態新增路由後刷新失效的問題
這篇文章主要介紹了關於vue如何解決addRoutes動態添加路由後刷新失效的問題,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
前言
某些場景下我們需要利用addRoutes動態添加路由,但是刷新後就會失效,前段時間專案裡剛好遇到了這個應用場景,所以就花時間研究了一下,做下分享跟記錄,說的不對的地方,請大家指正。
應用程式場景:使用者a登入系統,頁面上有個按鈕,點擊之後會動態加入路由並且跳轉,跳轉過去之後,使用者刷新後也會停留在目前頁面。不點這個按鈕,瀏覽器輸入位址,使用者會跳到404頁面
github:https://github.com/Mrblackant...
線上查看:http://an888.net/router/keepR...
#想法
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 'vue-router' import {constantRouterMap} from '@/router' export default { name: 'kk', mounted(){ }, data () { return { msg: 'Welcome to Your Vue.js App' } }, methods:{ srouter(){ let newRoutes=constantRouterMap.concat([{path:'/secondRouter', component :resolve => require(["@/components/kk"], resolve ) }]) this.$router.addRoutes(newRoutes) this.$router.push({path:'/secondRouter'}) } } } </script> //跳转过去的component组件,xxx.vue <template> <p> 恭喜你,动态添加路由成功,浏览器的链接已经变化; </p> <h3 id="无论你怎么刷新我都会留在当前页面">无论你怎么刷新我都会留在当前页面</h3> <h3 id="并且点击浏览器回退键-我会跳到之前页面-不会循环">并且点击浏览器回退键,我会跳到之前页面,不会循环</h3> </template> <script> import router2 from '@/router' import router from 'vue-router' export default { name: 'HelloWorld', mounted(){ localStorage.setItem('new',JSON.stringify({'path':'/secondRouter','component':'kk'}))//保存路由 }, data () { return { msg: 'Welcome to Your Vue.js App' } }, 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如何解決addRoutes動態新增路由後刷新失效的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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