电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:4日期: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
相關文章:
主站蜘蛛池模板: 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 四川职高信息网-初高中、大专、职业技术学校招生信息网 | 钢托盘,钢制托盘,立库钢托盘,金属托盘制造商_南京飞天金属制品实业有限公司 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 硫化罐-胶管硫化罐-山东鑫泰鑫智能装备有限公司 | 退火炉,燃气退火炉,燃气热处理炉生产厂家-丹阳市丰泰工业炉有限公司 | 航拍_专业的无人机航拍摄影门户社区网站_航拍网 | 温湿度记录纸_圆盘_横河记录纸|霍尼韦尔记录仪-广州汤米斯机电设备有限公司 | 莱州网络公司|莱州网站建设|莱州网站优化|莱州阿里巴巴-莱州唯佳网络科技有限公司 | 科昊仪器超纯水机系统-可成气相液氮罐-美菱超低温冰箱-西安昊兴生物科技有限公司 | 行业分析:提及郑州火车站附近真有 特殊按摩 ?2025实地踩坑指南 新手如何避坑不踩雷 | 网站建设-网站制作-网站设计-网站开发定制公司-网站SEO优化推广-咏熠软件 | 带式压滤机_污泥压滤机_污泥脱水机_带式过滤机_带式压滤机厂家-河南恒磊环保设备有限公司 | 软装设计-提供软装装饰和软装配饰及软装陈设的软装设计公司 | 冷库安装厂家_杭州冷库_保鲜库建设-浙江克冷制冷设备有限公司 | 蒸压釜_蒸养釜_蒸压釜厂家-山东鑫泰鑫智能装备有限公司 | 长江船运_国内海运_内贸船运_大件海运|运输_船舶运输价格_钢材船运_内河运输_风电甲板船_游艇运输_航运货代电话_上海交航船运 | sfp光模块,高速万兆光模块工厂-性价比更高的光纤模块制造商-武汉恒泰通 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | 合肥办公室装修 - 合肥工装公司 - 天思装饰| 深圳办公室装修,办公楼/写字楼装修设计,一级资质 - ADD写艺 | 深圳善跑体育产业集团有限公司_塑胶跑道_人造草坪_运动木地板 | 智能监控-安防监控-监控系统安装-弱电工程公司_成都万全电子 | 缓蚀除垢剂_循环水阻垢剂_反渗透锅炉阻垢剂_有机硫化物-郑州威大水处理材料有限公司 | 托利多电子平台秤-高精度接线盒-托利多高精度电子秤|百科 | 小型气象站_便携式自动气象站_校园气象站-竞道气象设备网 | 防爆鼓风机-全风-宏丰鼓风机-上海梁瑾机电设备有限公司 | 德国BOSCH电磁阀-德国HERION电磁阀-JOUCOMATIC电磁阀|乾拓百科 | 消防泵-XBD单级卧式/立式消防泵-上海塑泉泵阀(集团)有限公司 | 电镀整流器_微弧氧化电源_高频电解电源_微弧氧化设备厂家_深圳开瑞节能 | 英思科GTD-3000EX(美国英思科气体检测仪MX4MX6)百科-北京嘉华众信科技有限公司 | 电位器_轻触开关_USB连接器_广东精密龙电子科技有限公司 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 空气净化器租赁,空气净化器出租,全国直租_奥司汀净化器租赁 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 镀锌方管,无缝方管,伸缩套管,方矩管_山东重鑫致胜金属制品有限公司 | 单电机制砂机,BHS制砂机,制沙机设备,制砂机价格-正升制砂机厂家 单级/双级旋片式真空泵厂家,2xz旋片真空泵-浙江台州求精真空泵有限公司 | 模温机-油温机-电加热导热油炉-工业冷水机「欧诺智能」 | 建筑工程资质合作-工程资质加盟分公司-建筑资质加盟 |