摘要:更多文章寫后臺(tái)管理系統(tǒng),估計(jì)有不少人遇過這樣的需求根據(jù)后臺(tái)數(shù)據(jù)動(dòng)態(tài)添加路由和菜單。先看一下官方介紹動(dòng)態(tài)添加更多的路由規(guī)則。
更多文章
寫后臺(tái)管理系統(tǒng),估計(jì)有不少人遇過這樣的需求:根據(jù)后臺(tái)數(shù)據(jù)動(dòng)態(tài)添加路由和菜單。
為什么這么做呢?因?yàn)椴煌挠脩粲胁煌臋?quán)限,能訪問的頁面是不一樣的。
在網(wǎng)上找了好多資料,終于想到了解決辦法。
利用 vue-router 的 addRoutes 方法可以動(dòng)態(tài)添加路由。
先看一下官方介紹:
router.addRoutes
router.addRoutes(routes: Array)
動(dòng)態(tài)添加更多的路由規(guī)則。參數(shù)必須是一個(gè)符合 routes 選項(xiàng)要求的數(shù)組。
舉個(gè)例子:
const router = new Router({ routes: [ { path: "/login", name: "login", component: () => import("../components/Login.vue") }, {path: "/", redirect: "/home"}, ] })
上面的代碼和下面的代碼效果是一樣的
const router = new Router({ routes: [ {path: "/", redirect: "/home"}, ] }) router.addRoutes([ { path: "/login", name: "login", component: () => import("../components/Login.vue") } ])
在動(dòng)態(tài)添加路由的過程中,如果有 404 頁面,一定要放在最后添加,否則在登陸的時(shí)候添加完頁面會(huì)重定向到 404 頁面。
類似于這樣,這種規(guī)則一定要最后添加。
{path: "*", redirect: "/404"}動(dòng)態(tài)生成菜單
假設(shè)后臺(tái)返回來的數(shù)據(jù)長這樣
// 左側(cè)菜單欄數(shù)據(jù) menuItems: [ { name: "home", // 要跳轉(zhuǎn)的路由名稱 不是路徑 size: 18, // icon大小 type: "md-home", // icon類型 text: "主頁" // 文本內(nèi)容 }, { text: "二級(jí)菜單", type: "ios-paper", children: [ { type: "ios-grid", name: "t1", text: "表格" }, { text: "三級(jí)菜單", type: "ios-paper", children: [ { type: "ios-notifications-outline", name: "msg", text: "查看消息" }, { type: "md-lock", name: "password", text: "修改密碼" }, { type: "md-person", name: "userinfo", text: "基本資料", } ] } ] } ]
來看看怎么將它轉(zhuǎn)化為菜單欄,我在這里使用了 iview 的組件,不用重復(fù)造輪子。
代碼不用看得太仔細(xì),理解原理即可,其實(shí)就是通過三次 v-for 不停的對(duì)子數(shù)組進(jìn)行循環(huán),生成三級(jí)菜單。
動(dòng)態(tài)菜單這樣就可以實(shí)現(xiàn)了。
動(dòng)態(tài)路由,因?yàn)樯厦嬉呀?jīng)說過了用 addRoutes 來實(shí)現(xiàn),現(xiàn)在看看具體怎么做。
首先,要把項(xiàng)目所有的頁面路由都列出來,再用后臺(tái)返回來的數(shù)據(jù)動(dòng)態(tài)匹配,能匹配上的就把路由加上,不能匹配上的就不加。
最后把這個(gè)新生成的路由數(shù)據(jù)用 addRoutes 添加到路由表里。
const asyncRoutes = { "home": { path: "home", name: "home", component: () => import("../views/Home.vue") }, "t1": { path: "t1", name: "t1", component: () => import("../views/T1.vue") }, "password": { path: "password", name: "password", component: () => import("../views/Password.vue") }, "msg": { path: "msg", name: "msg", component: () => import("../views/Msg.vue") }, "userinfo": { path: "userinfo", name: "userinfo", component: () => import("../views/UserInfo.vue") } } // 傳入后臺(tái)數(shù)據(jù) 生成路由表 menusToRoutes(menusData) // 將菜單信息轉(zhuǎn)成對(duì)應(yīng)的路由信息 動(dòng)態(tài)添加 function menusToRoutes(data) { const result = [] const children = [] result.push({ path: "/", component: () => import("../components/Index.vue"), children, }) data.forEach(item => { generateRoutes(children, item) }) children.push({ path: "error", name: "error", component: () => import("../components/Error.vue") }) // 最后添加404頁面 否則會(huì)在登陸成功后跳到404頁面 result.push( {path: "*", redirect: "/error"}, ) return result } function generateRoutes(children, item) { if (item.name) { children.push(asyncRoutes[item.name]) } else if (item.children) { item.children.forEach(e => { generateRoutes(children, e) }) } }
所有的代碼實(shí)現(xiàn),我都放在 github 上,動(dòng)態(tài)菜單的實(shí)現(xiàn)放在這個(gè)項(xiàng)目下的 src/components/Index.vue、src/permission.js 和 src/utils/index.js下
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/104846.html
摘要:實(shí)現(xiàn)動(dòng)態(tài)緩存以及緩存銷毀需求來源及描述后臺(tái)管理系統(tǒng)中,左側(cè)為功能菜單欄,點(diǎn)擊菜單列表,右側(cè)顯示該菜單的功能頁面,本來是一個(gè)非常簡單的后臺(tái)管理系統(tǒng)布局,現(xiàn)在增加了菜單按鈕點(diǎn)擊左側(cè)菜單欄時(shí),右側(cè)頁面頭部顯示當(dāng)前的頁面標(biāo)題,形成一個(gè)列表,點(diǎn)擊可 vue keep-alive實(shí)現(xiàn)動(dòng)態(tài)緩存以及緩存銷毀 需求來源及描述 后臺(tái)管理系統(tǒng)中,左側(cè)為功能菜單欄,點(diǎn)擊菜單列表,右側(cè)顯示該菜單的功能頁面,本來...
摘要:具體實(shí)現(xiàn)請(qǐng)查看和的退出登陸回調(diào)方法。現(xiàn)在除了必要的頁面需要在一開始添加到路由表里,其他的頁面都可以根據(jù)后臺(tái)數(shù)據(jù)來自動(dòng)生成。另外,如果在未登陸時(shí)要訪問某一指定頁面,會(huì)重定向到登陸頁,登陸成功后會(huì)自動(dòng)跳到這個(gè)指定頁面。 項(xiàng)目地址 vue-admin-template 在線預(yù)覽 更新 2019.6.25 更新 修復(fù)路由表沖突問題 退出當(dāng)前用戶,換賬號(hào)重新登陸時(shí),上個(gè)賬號(hào)和現(xiàn)在的賬號(hào)路由表會(huì)有...
摘要:權(quán)限系統(tǒng)后臺(tái)管理系統(tǒng)一般都會(huì)有權(quán)限模塊,用來控制用戶能訪問哪些頁面和哪些數(shù)據(jù)接口。大多數(shù)管理系統(tǒng)的頁面都長這樣。表為角色權(quán)限關(guān)聯(lián)表,一個(gè)角色擁有哪些權(quán)限是通過這張表查出來的。這樣就是一個(gè)賬號(hào)角色權(quán)限的關(guān)系。 vue權(quán)限系統(tǒng) 后臺(tái)管理系統(tǒng)一般都會(huì)有權(quán)限模塊,用來控制用戶能訪問哪些頁面和哪些數(shù)據(jù)接口。大多數(shù)管理系統(tǒng)的頁面都長這樣。 showImg(https://segmentfault...
摘要:如果一個(gè)頁面,有角色越權(quán)訪問,這時(shí)就得做出限制了。我們可以通過或來實(shí)現(xiàn),下面用代碼來展示一下如何用控制登陸驗(yàn)證。 更多文章 頁面權(quán)限控制 頁面權(quán)限控制是什么意思呢? 就是一個(gè)網(wǎng)站有不同的角色,比如管理員和普通用戶,要求不同的角色能訪問的頁面是不一樣的。如果一個(gè)頁面,有角色越權(quán)訪問,這時(shí)就得做出限制了。 Vue 動(dòng)態(tài)添加路由及生成菜單這是我寫過的一篇文章,通過動(dòng)態(tài)添加路由和菜單來做控制,...
閱讀 3453·2019-08-30 15:44
閱讀 798·2019-08-30 13:46
閱讀 2058·2019-08-30 11:05
閱讀 3332·2019-08-29 18:32
閱讀 2155·2019-08-29 13:56
閱讀 1296·2019-08-29 12:57
閱讀 757·2019-08-28 18:21
閱讀 1734·2019-08-26 12:16