日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

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

場景復(fù)現(xiàn):

做前端開發(fā)的同學(xué),大多都遇到過這種需求:頁面菜單根據(jù)用戶權(quán)限動態(tài)生成,一個常見的解決方案是:

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

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

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

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

捋一捋

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

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

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

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

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

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

經(jīng)過一番搜索,終于找到了一種方法,即重置當(dāng)前router的match屬性:

router.js

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

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

總結(jié):

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

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

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

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

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

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品国产99国产| 老司机免费视频一区二区三区| 国产毛片精品| 欧美日一区二区在线观看| 99国产精品视频免费观看一公开| 久久久久久免费视频| 亚洲二区三区不卡| 亚洲精品一区二区在线看| 久久福利精品| 日韩欧美高清一区二区三区| 日韩精品一区二区三区中文| 欧美亚洲国产日韩| 亚洲图片久久| 日韩黄色免费网站| 国产精品大片免费观看| 国产精品麻豆久久| 蜜桃成人av| 蜜桃视频一区二区三区| 日韩激情视频网站| 国产精品片aa在线观看 | 国产欧美日韩亚洲一区二区三区| 嫩草伊人久久精品少妇av杨幂| 国产+成+人+亚洲欧洲在线| 日韩在线欧美| 美女被久久久| 免费视频一区二区三区在线观看| 久久激情综合网| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 国产精品久久国产愉拍| 福利片在线一区二区| 国产亚洲在线| 久久av国产紧身裤| 午夜国产精品视频免费体验区| **爰片久久毛片| 久久国产电影| 日韩av一级片| 99久久精品网| 国产日韩一区二区三免费高清| 日韩免费小视频| 婷婷综合电影| 99精品视频在线| 国产精品一区二区三区四区在线观看| 91精品蜜臀一区二区三区在线 | 国产乱码精品一区二区三区亚洲人 | 欧美a级一区二区| 国产一区清纯| 国产精品久久久久久久久久齐齐| 亚洲午夜精品久久久久久app| 欧美亚洲国产日韩| 国内不卡的一区二区三区中文字幕| 欧美国产91| 免费在线播放第一区高清av| 久久亚洲色图| 欧洲av一区二区| 国产激情久久| 色综合视频一区二区三区日韩 | 免播放器亚洲一区| 亚洲永久av| 亚洲tv在线| 91精品国产调教在线观看 | 国产毛片一区| 午夜精品成人av| 国产精品午夜av| 亚洲乱码一区| 亚洲欧美视频| 亚洲国产专区校园欧美| 国产一区二区三区黄网站| 中文字幕成人| 国内精品福利| 超级白嫩亚洲国产第一| 国产欧美69| 一区二区国产在线| 91精品二区| 国产麻豆久久| 国产一区二区精品久| 亚洲精品字幕| 免费久久99精品国产| 狠狠久久婷婷| 91久久国产| 国产精品久久久久av电视剧| 国产精品极品| 国产精品美女午夜爽爽| 日韩高清一级| 亚洲综合五月| 免费成人在线观看| 老鸭窝毛片一区二区三区| 欧美日韩激情| 欧美日韩国产欧| 激情综合网址| 蜜桃国内精品久久久久软件9| 精品黄色一级片| 欧美激情福利| 精品国内亚洲2022精品成人| 精品国产一区二区三区av片| 国产高清日韩| 精品少妇av| 色爱综合网欧美| av资源中文在线| 精精国产xxxx视频在线播放| 日韩精品影视| 久久一区二区三区电影| 一区二区亚洲精品| 久久大逼视频| 日本不卡视频在线观看| 国产日韩在线观看视频| 日韩欧美中文字幕电影 | 日韩高清一级| 国产精品主播| 丰满少妇一区| 久久人人97超碰国产公开结果| 欧美不卡在线| 蜜桃久久久久久| 久久精品凹凸全集| 精品视频国内| 91精品国产自产在线观看永久∴| 好吊视频一区二区三区四区| 日韩制服丝袜先锋影音| 青青青国产精品| 国产一区二区久久久久| 高清在线一区| 免费观看久久av| 亚洲免费观看高清完整版在线观| 欧美亚洲一区二区三区| 国产一区二区三区久久| 999精品色在线播放| 亚洲欧美激情诱惑| 欧美一区不卡| av资源中文在线| 黑丝一区二区三区| 久久精品xxxxx| 日韩啪啪电影网| 亚洲一区二区三区四区五区午夜| 日韩激情一区二区| 欧美丰满日韩| 亚洲国产不卡| 日本不卡一区二区| 视频在线不卡免费观看| 在线视频精品| 麻豆91小视频| 尹人成人综合网| 国产精品网站在线看| 伊人久久高清| 91精品国产自产观看在线| 日韩免费在线| 青青草伊人久久| 成人va天堂| 欧美天堂一区| 激情综合网五月| 久久伊人亚洲| 免费精品视频| 国产精品主播| 蜜桃国内精品久久久久软件9| 国产精品自拍区| 日韩三级一区| 91久久亚洲| 日韩成人精品一区二区| 天堂精品久久久久| 久久久久久久久99精品大| 日韩av字幕| 合欧美一区二区三区| 久久99高清| 日韩精品一区二区三区免费视频| 久久久久国产| 日韩综合在线| 亚洲视频电影在线| 久久久久久久久丰满| 欧美成人一二区| 午夜电影一区| 一区在线免费观看| 国产精品黑丝在线播放| 欧美日韩1区| 蜜桃久久av一区| 亚洲91视频| 精品国产乱码久久久| 日韩高清不卡一区| 亚洲视频www| 欧美日韩在线观看视频小说| 国产中文欧美日韩在线| 欧美午夜三级| 国产精品视区| 99久久精品费精品国产| 电影91久久久| 国产精品一区二区美女视频免费看| 丝袜美腿亚洲色图| 国产精品99在线观看| 欧美国产专区| 欧美亚洲tv| 日本不卡在线视频| 石原莉奈一区二区三区在线观看| 久久久久网站| 成人福利视频| 国产一区二区三区亚洲综合| 欧美成人精品一级| 国产毛片精品久久| 亚欧洲精品视频在线观看| 只有精品亚洲| 香蕉久久国产| 久久高清免费观看| 丝袜脚交一区二区| 免费国产亚洲视频|