vue實現(xiàn)頁面權限中的菜單配置

通過一個數(shù)組渲染菜單棒动,實現(xiàn)頁面權限的自動配置吼虎。

框架和UI選擇

  1. vue
  2. vue-router
  3. element-ui
  4. vuex

思路

n級菜單有n-1級菜單構成......以此類推可得:多級菜單就是通過二級菜單循環(huán)構成。在element-ui中找到NavMenu 導航菜單組件寻歧,使用該組件做一個二級菜單的循環(huán)體組件胸囱。菜單數(shù)據(jù)存儲在vuex中祷舀。

基礎菜單的循環(huán)體組件(以二級菜單為例)

在組件中判斷是否有子集來加載不同的模塊。二級菜單內部通過插槽來加載循環(huán)生成的一級組件數(shù)組,如下list-item組件

// index屬性可以用菜單對象中的屬性代替(item.key之類的)
// 菜單下拉區(qū)域裳扯,在有子集的情況下渲染
  <el-submenu v-if="item.sonList" :index="i">
    <template slot="title">
      <i v-if="item.icon" :class="item.icon" />
      <span>{{ item.name }}</span>
    </template>
    // 放置前一級菜單的循環(huán)節(jié)點
    <slot />
  </el-submenu>
// 單行菜單區(qū)域抛丽,無子集的情況下渲染
  <el-menu-item v-else :index="i">
    <i v-if="item.icon" :class="item.icon" />
    <router-link slot="title" :to="item.path">
      {{ item.name }}
    </router-link>
  </el-menu-item>

index屬性可以用菜單對象中的任意屬性代替只需要它是唯一的

通過遞歸函數(shù)獲取樹型結構的菜單列表
  1. 渲染菜單列表
render (createElement) {
    let domArr = []
    let path = '/routeD'  // 根路由,可以自定義
    // arr:子集節(jié)點饰豺,zIndex:層級(用于生成index)
    const reduceFun = function (arr, zIndex) {
      const lArr = []
      for (let i = 0; i < arr.length; i++) {
        const el = JSON.parse(JSON.stringify(arr[i]))
        let index
        let domList = null
        // 用于生成唯一的index亿鲜,如果使用菜單中的屬性的話可以去除zIndex和該段邏輯
        if (zIndex !== 1) {
          index = zIndex + '-' + i
        } else {
          index = i.toString()
        }
        if (!el.path.includes('/')) {
          el.path = path + '/' + el.path
        }
        if (el.sonList) {
          path = el.path
          const domObj = reduceFun(el.sonList, index)
          let arrPath = el.path.split('/')
          path = arrPath.slice(0,-1).join('/')
          domList = domObj.lArr
        }
        const dom = createElement('list-item', {
          props: {
            item: el,
            i: el.key || i.toString()
          }
        }, domList)
        lArr.push(dom)
      }
      return {
        lArr
      }
    }
    const obj = reduceFun(this.$store.getters.meanList, 1)
    domArr = obj.lArr
    return createElement('el-menu', {
      class: 'el-menu-vertical-demo',
      props: {
        'default-active': '1'
      },
      on: {
        select (obj) {
          console.log(obj)
        }
      }
    }, domArr)
  }
  1. 根據(jù)菜單數(shù)據(jù)動態(tài)添加路由
// 導入路由中的權限路由
import { powerRoute } from '@/router'
····
// 遞歸獲取菜單數(shù)據(jù)中的路由,再通過addRoutes添加路由
const reduceFun = function (arr) {
  const routes = []
  for (let i = 0; i < arr.length; i++) {
    const el = arr[i]
    let routeObj = {}
    routeObj = {
      path: el.path,
      component: el.component
    }
    if (el.sonList) {
      const childRoute = reduceFun(el.sonList)
      routeObj.children = childRoute
    }
    routes.push(routeObj)
  }
  return routes
}
const routes = reduceFun(this.$store.getters.meanList)
let oldR = powerRoute[0]
oldR.children = routes
this.$router.addRoutes([oldR])
····

從后臺獲取不同角色的不同菜單數(shù)據(jù)哟忍,再通過兩個遞歸函數(shù)來渲染菜單和動態(tài)添加菜單路由狡门,實現(xiàn)頁面的權限配置。

演示

https://erpang123.github.io/router-demo/dist-demo/index.html

完整案例:https://github.com/erpang123/router-demo

效果

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末锅很,一起剝皮案震驚了整個濱河市其馏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌爆安,老刑警劉巖叛复,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扔仓,居然都是意外死亡褐奥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門翘簇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撬码,“玉大人,你說我怎么就攤上這事版保∥匦Γ” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵彻犁,是天一觀的道長叫胁。 經常有香客問我,道長汞幢,這世上最難降的妖魔是什么驼鹅? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮森篷,結果婚禮上输钩,老公的妹妹穿的比我還像新娘。我一直安慰自己疾宏,他們只是感情好张足,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坎藐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岩馍,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天碉咆,我揣著相機與錄音,去河邊找鬼蛀恩。 笑死疫铜,一個胖子當著我的面吹牛,可吹牛的內容都是我干的双谆。 我是一名探鬼主播壳咕,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼顽馋!你這毒婦竟也來了谓厘?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤寸谜,失蹤者是張志新(化名)和其女友劉穎竟稳,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熊痴,經...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡他爸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了果善。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诊笤。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖巾陕,靈堂內的尸體忽然破棺而出讨跟,到底是詐尸還是另有隱情,我是刑警寧澤惜论,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布许赃,位于F島的核電站,受9級特大地震影響馆类,放射性物質發(fā)生泄漏混聊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一乾巧、第九天 我趴在偏房一處隱蔽的房頂上張望句喜。 院中可真熱鬧,春花似錦沟于、人聲如沸咳胃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽展懈。三九已至销睁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間存崖,已是汗流浹背冻记。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留来惧,地道東北人冗栗。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像供搀,于是被迫代替她去往敵國和親隅居。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容

  • 基于Vue的一些資料 內容 UI組件 開發(fā)框架 實用庫 服務端 輔助工具 應用實例 Demo示例 element★...
    嘗了又嘗閱讀 1,151評論 0 1
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    小姜先森o0O閱讀 9,480評論 0 72
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    王喂馬_閱讀 6,454評論 1 77
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    你猜_3214閱讀 11,059評論 0 118
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    流觴小菜鳥閱讀 1,760評論 2 8