成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

vue-router之解決addRoutes使用遇到的坑

瀏覽:2日期:2023-01-03 10:16:48

最近項目中使用了vue-router的addRoutes這個api,遇到了一個小坑,記錄總結一下。

場景復現:

做前端開發的同學,大多都遇到過這種需求:頁面菜單根據用戶權限動態生成,一個常見的解決方案是:

前端初始化的時候,只掛載不需要權限路由,如登陸,注冊等頁面路由,然后等用戶登錄之后,后端返回當前用戶的權限表,前端根據這個權限表遍歷前端路由表,動態生成用戶權限路由,然后使用vue-router提供的addRoutes,將權限路由表動態添加到路由實例中,整個過程大致如下:

// router.js 文件 // 需要用戶權限的路由表const appRoutes = [ { path: ’/dashboard’, name: ’dashboard’, component: () => import(’...’), children: [ RouteConfig1, RouteConfig2, ... ] }, RouteConfig, ...]; // 不需要用戶權限的路由表const constantRoutes = [ { path: ’/login’, name: ’login’, component: Login }, { path: ’/register’, name: ’register’, component: Register }, ...] // 初始化路由的時候,只掛載不需要用戶權限的路由表const router = new VueRouter({ mode: ’history’, base: process.env.BASE_URL, constantRoutes}); /** * * 假如后端返回的數據格式如下: * * { * status: 200, * message: ’successful’, * data: { * user: {...}, * token: ’...’, * permisssion: [...] * } * } * * login.vue */axios.post(’/user/login’,{username,password}) .then(res => { if (res.status === 200) { // 如果登錄成功,則需要遍歷生成用戶權限路由 // filterRoutes根據permission和router.js中定義的appRoutes生成動態路由表 const routes = filterRoutes(permission); // 然后使用addRoutes將routes掛載到router中 router.addRoutes(routes); } else { ... } }) .catch(error => { ... })

寫到這里,貌似動態生成路由的功能就好了,一切都perfect了,但問題緊接著就來了,當用戶登錄之后,我們點擊頁面上的退出按鈕退出當前登錄,然后重新登錄,會發現瀏覽器console面板緊接著就報如下錯誤:

納尼(⊙o⊙)?這是怎么回事呢,第二次登錄也正常登錄了,功能上似乎沒有什么問題,但這個警告從哪里來的呢?對于一個重度強迫癥患者來說,任何警告和報錯都是不允許出現的,哪怕功能上沒什么問題。

捋一捋

這段警告的意思是說,以上的這幾個路由命名重復,存在多個name相同的路由。那么為什么會有多個路由名稱相同的路由呢?

讓我們從頭捋一下這個錯誤是怎么來的。首先第一次打開網站登錄的時候是沒有問題的,只有當我們退出登錄,重新登錄的時候,這段警告就來了。并且如果我們在重復登錄之前刷新一下瀏覽器然后再登錄,這種警告就不會出現了,很神奇是不是?

分析一下上面的情景:首先這個警告只會在用戶重新登錄的時候出現,登錄的時候我們做的唯一跟路由相關的事情就是動態添加路由,所以問題肯定出在 router.addRoutes(routes)這里,其次這里又分了兩種情況:有刷新和無刷新。在無刷新的情況下會報這個警告,有刷新就不會報這個警告。那么有刷新和無刷新有什么區別呢?

我們很容易就想到,當頁面刷新的時候,Vue實例會重新初始化,Vue實例初始化的過程中,掛載在它上面的Vue-Router,Store等內容也會重新初始化。而在不刷新的情況下,就不會重新初始化。

再想想,我們第一次登錄之后,通過addRoutes添加了權限路由routes到router上,假設我們這個權限routes中包括了dashboard,user,role三個路由,那么當我們退出登錄,然后重新登錄的時候,由于同一個用戶登錄,后端返回的權限列表是一樣的,生成的動態路由routes也是一樣的(即里面同樣包含了dashboard,user,role三個路由),那么此時再次添加這三個路由就導致router中掛載的routes重復。而在刷新的情況下,由于router重新初始化,只包含了初始化我們添加的不需要權限的路由,此時再次登錄,重新添加就不存在路由重復的問題了。

通過以上的分析,我們搞清了問題的來源,那么如何解決呢,很遺憾,vue-router并沒有刪除路由的api。根據以上的分析,我們很容易想到,通過強制刷新頁面的方式來重置router:即當用戶退出登錄的時候,通過js強制刷新一下頁面。就可以解決問題。這種方式雖然可以解決問題,但顯得不是很優雅,而且刷新頁面導致資源重新加載和頁面閃爍,體驗也不是特別好。因此有沒有在不刷新的情況下解決問題的辦法呢?

經過一番搜索,終于找到了一種方法,即重置當前router的match屬性:

router.js

// 定義一個函數來創建routerexport const createRouter = routes => new VueRouter({ mode: ’history’, base: process.env.BASE_URL, routes}); // 在使用addRoutes的地方// 重置當前router的match = 初始router.matchrouter.match = createRouter(constantRoutes).match;router.addRoutes(routes);

這樣就可以完美解決問題了。

總結:

整個解決的過程還是比較痛苦的,因為實際中我的代碼是比較復雜的,并不像上面簡化后那么簡單。

整個addRoutes是在store.dispatch中完成,并且中間還夾雜著生成動態路由,根據動態路由再生成用戶菜單等一系列功能,干擾比較大,并且這個是源碼報警,不好定位,只能通過console和瀏覽器調試,一步步縮小報錯范圍,最終找到問題原因。

然后再通過google,以及搜索vue-router倉庫的issue一步步找到解決方法。

所以想說,如果大家開發中遇到一些第三方依賴的問題,可以去搜索官方倉庫的issue,很好用的,很多問題其實issue中都有答案。我是屢試不爽。

最后,一定要用google,百度,浪費我好長時間,啥都沒找到~

標簽: Vue
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
精品三级av在线| 99re热这里只有精品视频| 高清久久久久久| 欧美视频一区二区| 天天综合天天做天天综合| 9国产精品视频| 亚洲精选在线视频| 亚洲黄色成人久久久| 国产精品久久久爽爽爽麻豆色哟哟| 不卡电影一区二区三区| 5858s免费视频成人| 国产综合色视频| 亚洲一区三区视频在线观看| 夜夜嗨av一区二区三区中文字幕| 一区二区三区欧美在线| 一区二区三区在线影院| 一区二区三区四区五区视频 | 亚洲大片在线观看| 国产精品视区| 亚洲成人自拍网| 色网综合在线观看| 蜜桃av一区二区在线观看| 欧美色网一区二区| 九九视频精品免费| 在线观看91av| 成人aaaa免费全部观看| 26uuu欧美| 国内久久精品| 亚洲男帅同性gay1069| 国产精品美女xx| 日韩国产在线观看| 欧美三级午夜理伦三级中视频| 国产精品系列在线播放| 精品国产3级a| 欧美另类视频在线| 亚洲精品成人精品456| 一本久道久久综合狠狠爱| 一二三区精品视频| 男人的天堂亚洲| 免费人成在线不卡| 在线播放欧美女士性生活| 丰满放荡岳乱妇91ww| 国产无人区一区二区三区| 亚洲小说欧美另类婷婷| 亚洲午夜久久久| 欧美日韩精品系列| 99精品久久免费看蜜臀剧情介绍| 日本一区二区久久| 国产精品日韩二区| 狠狠色丁香婷婷综合| 精品久久久久久久久久久久久久久| 91猫先生在线| **性色生活片久久毛片| 影音先锋亚洲精品| 日本在线播放一区二区三区| 欧美一区二区三区喷汁尤物| 欧美在线影院| 性欧美疯狂xxxxbbbb| 欧美精品第1页| 色综合久久中文综合久久牛| 亚洲六月丁香色婷婷综合久久| 久久人人97超碰人人澡爱香蕉| 国产一区二区三区最好精华液| 久久精品一级爱片| 国产精品午夜av在线| 久久国产成人午夜av影院| 久久综合色播五月| 亚洲欧美成人| 国产一区二区在线观看免费| 国产日本欧洲亚洲| 久久国产主播| 成人午夜精品一区二区三区| 亚洲人123区| 欧美日韩精品一区二区三区 | 亚洲一区二区三区四区五区黄| 在线精品亚洲一区二区不卡| 粉嫩久久99精品久久久久久夜| 成人欧美一区二区三区白人| 91国产精品成人| 色综合中文综合网| 欧美日韩大片一区二区三区| 日韩福利电影在线观看| 日韩欧美一级二级三级久久久| 亚洲香蕉网站| 国内精品在线播放| 国产精品电影一区二区| 在线中文字幕一区二区| 91色.com| 蜜臀av一区二区| 国产精品你懂的在线欣赏| 欧美午夜寂寞影院| 亚洲二区免费| 国产成人av福利| 亚洲欧美另类在线| 欧美一二三四区在线| 一本一道久久综合狠狠老精东影业 | 国产精品毛片久久久久久久| 日本久久一区二区| 欧美一区二区三区另类| 日本中文字幕一区二区视频| 国产精品免费人成网站| 欧美另类一区二区三区| 尤物在线精品| 国产精品综合视频| 亚洲无人区一区| 久久久久亚洲蜜桃| 欧美三级电影在线看| 亚洲黑丝一区二区| 成人av网站大全| 日精品一区二区三区| 日本一区二区视频在线| 欧美色偷偷大香| 在线亚洲免费| 91首页免费视频| 激情小说亚洲一区| 亚洲黄色免费电影| 2014亚洲片线观看视频免费| 91国产免费观看| 伊人久久大香线蕉综合热线| 国产原创一区二区三区| 一区二区三区欧美亚洲| 久久亚区不卡日本| 欧美体内she精视频| 99精品国产福利在线观看免费| caoporm超碰国产精品| 精品一区二区三区在线视频| 亚洲国产精品一区二区久久恐怖片| 国产亚洲视频系列| 91精品久久久久久久99蜜桃| 色婷婷亚洲婷婷| 99亚洲一区二区| 亚洲欧美亚洲| 欧美bbbxxxxx| 欧美肥妇free| 国产成人激情av| 亚洲欧美激情在线| 国产欧美日韩精品a在线观看| 欧美精品欧美精品系列| 久久九九99| 夜久久久久久| 国产精品二区影院| 99久久久久久| 国产成人在线视频播放| 青青草国产精品亚洲专区无| 一区二区三区.www| 中文字幕中文字幕一区二区| 久久亚洲二区三区| 日韩三级视频在线看| 日本二三区不卡| 久久精品天堂| 国产精品日本| 国产日韩亚洲欧美精品| 激情国产一区| 欧美日韩国产综合视频在线| 99久久婷婷国产精品综合| 国产成人精品一区二| 国产美女久久久久| 国产乱码精品一品二品| 老司机精品视频导航| 日韩不卡免费视频| 日本在线不卡视频一二三区| 无码av中文一区二区三区桃花岛| 一区二区三区四区不卡在线| 亚洲欧美在线高清| 中文一区二区在线观看| 久久久久久久久免费| 精品国产一二三区| 日韩欧美一区在线| 欧美一区二区大片| 制服丝袜亚洲播放| 在线播放欧美女士性生活| 欧美日韩另类一区| 欧美日韩久久不卡| 欧美日本在线观看| 欧美伦理视频网站| 欧美久久婷婷综合色| 欧美福利视频导航| 7799精品视频| 欧美一区二区三区在线观看视频| 欧美一区二区三区免费视频| 欧美丰满嫩嫩电影| 777xxx欧美| 日韩写真欧美这视频| 精品欧美一区二区三区精品久久| 精品久久久久久久久久久久包黑料| 精品国偷自产国产一区| 久久久精品免费观看| 欧美激情中文字幕一区二区| 国产精品沙发午睡系列990531| 国产精品视频你懂的| 亚洲精品久久久蜜桃| 午夜久久电影网| 六月丁香婷婷色狠狠久久| 精品制服美女久久| 国产精品综合在线视频| 成人国产视频在线观看| 欧美国产高清| 亚洲国产精品一区| 亚洲欧美日韩精品综合在线观看| 久久综合久久综合这里只有精品|