element菜單嵌套動態(tài)渲染

背景:用element實現(xiàn)一個動態(tài)菜單闸英,支持多層級菜單

頁面布局:layout文件夾??

?layout.vue(菜單入口)?

side-bar.vue

compomne.vue 右側(cè)視圖組件, 支持 路由 iframe切換

1.layout.vue代碼

<template>

<template>

??<div?class="layout">

????<el-header>海外主題管理臺?<span><i?v-if="isCollapse"

???????????class="el-icon-s-unfold"

???????????@click="isCollapse?=?false"></i><i?class="el-icon-s-fold"

???????????v-else

???????????@click="isCollapse?=?true"></i></span></el-header>

????<el-container>

??????<div?:class="isCollapse???'left-content-colse'?:?'left-content'">

????????<el-aside?style="width:225px">

??????????<el-scrollbar?style="height:100%">

????????????<el-menu?class="el-menu-vertical-demo"

?????????????????????:default-active="componentId"

?????????????????????@open="handleOpen"

?????????????????????@close="handleClose"

?????????????????????:collapse-transition="false"

?????????????????????:unique-opened="true"

?????????????????????:collapse="isCollapse">

??????????????<side-bar?:list="menuList"

????????????????????????@onActive="onActive"

????????????????????????:isCollapse="isCollapse"></side-bar>

????????????</el-menu>

??????????</el-scrollbar>

????????</el-aside>

??????</div>

??????<el-main>

????????<Components?:componentId="componentId"></Components>

??????</el-main>

????</el-container>

??</div>

</template>

<script>

import?{?sideBarData?}?from?'./menuConfig'

import?SideBar?from?'./side-bar.vue'

import?Components?from?'./components.vue'

import?{?mapGetters?}?from?"vuex";

export?default?{

??components:?{?SideBar,?Components?},

??data()?{

????return?{

??????componentId:?'1-1',

??????isCollapse:?false,

??????menuList:?sideBarData

????};

??},

??methods:?{

????onActive(item)?{

??????this.componentId?=?item.id

??????this.$store.commit("saveActiveMenuId",?this.componentId);

????},

????handleOpen(key,?keyPath)?{

??????console.log(key,?keyPath,?'1111');

????},

????handleClose(key,?keyPath)?{

??????console.log(key,?keyPath);

????},

??},

??watch:?{},

??computed:?{

????...mapGetters(["activeMenuId"]),

??},

??created()?{

????if?(this.activeMenuId)?this.componentId?=?this.activeMenuId;

??},

??mounted()?{?},

};

</script>

<style?lang="less"?scoped>

.layout?{

??position:?absolute;

??top:?0;

??left:?0;

??width:?100vw;

??height:?100%;

??overflow:?hidden;

}

.left-content?{

??height:?100vh;

??overflow:?hidden;

}

.left-content-colse?{

??width:?64px;

??height:?100vh;

??background:?red;

??overflow:?hidden;

}

.el-submenu__title?{

??span?{

????display:?inline-block;

????overflow:?hidden;

????text-overflow:?ellipsis;

????white-space:?nowrap;

??}

}

</style>

<style>

.el-header?{

??background-color:?#008dff;

??color:?#fff;

??font-size:?18px;

??height:?auto;

??line-height:?60px;

}

.el-menu?{

??background-color:?#13254a;

??border-right:?none;

??color:?#fff;

}

.el-submenu__title?{

??color:?#fff;

??z-index:?9?!important;

}

.el-menu-item?{

??color:?#fff;

??border-color:?none;

}

.el-aside?{

??background-color:?#13254a;

??height:?100%;

??color:?#fff;

??transition:?width?0.5s;

}

.el-submenu__title:hover?{

??color:?#fff;

??background-color:?rgb(0,?141,?255,?0.2)?!important;

}

.el-menu-item:hover?{

??color:?#fff;

??background-color:?rgb(0,?141,?255,?0.2)?!important;

}

.el-menu-item.is-active?{

??color:?#fff;

??background-color:?#008dff?!important;

}

.el-main?{

??background-color:?#e9eef3;

??color:?#333;

}

.el-icon-menu:before?{

??content:?"\e798";

??color:?#fff;

}

/*?

.el-menu-vertical-demo:not(.el-menu--collapse)?{

??width:?200px;

??min-height:?400px;

}?*/

</style>

2.side-bar.vue 代碼

<template>

??<fragment>

????<template?v-for="(item,index)?in?list">

??????<!--?標題?-->

??????<template?v-if="item.children?&&?item.children.length">

????????<el-submenu?:key="index"

????????????????????:index="item.id"

????????????????????@click="onClick(item)">

??????????<template?:index="item.id"

????????????????????slot="title">

????????????<i?:class="item.icon"

???????????????style="color:#fff"></i>

????????????<span?slot="title">{{item.name}}</span>

??????????</template>

??????????<el-menu-item-group>

????????????<sideBar?:list="item.children"

?????????????????????v-bind="$attrs"

?????????????????????v-on="$listeners"></sideBar>

??????????</el-menu-item-group>

????????</el-submenu>

??????</template>


??????<!--?選項?-->

??????<template?v-else>

????????<el-menu-item?:key="index"

??????????????????????@click="onClick(item)"

??????????????????????:index="item.id">

??????????<i?:class="item.icon"></i>

??????????<!--?<router-link?:to="item.path">{{item.name}}</router-link>?-->

??????????<span?slot="title">{{item.name}}</span>

????????</el-menu-item>

??????</template>

????</template>

??</fragment>

</template>

<script>

export?default?{

??name:?"sideBar",

??props:?{

????list:?Array,

????isCollapse:?Boolean

??},

??created()?{

??},

??methods:?{

????onClick(val)?{

??????this.$emit('onActive',?val)

????}

??}

};

</script>

<style></style>


3.components.vue代碼

<template>

??<div?class="box"

???????v-loading="loading">

????<template>

??????<iframe?id="myIframe"

??????????????:src="path"

??????????????frameborder="0"></iframe>

????</template>

????<template>

??????<router-view></router-view>

????</template>

??</div>

</template>

<script>

import?{?sideBarData?}?from?'./menuConfig'

export?default?{

??name:?"components",

??props:?{

????componentId:?String,

????list:?Array,

??},

??watch:?{

????componentId:?{

??????handler(val)?{

????????if?(val)?{

??????????this.loading?=?true;

??????????this.getNode(this.menuList,?val);

????????}

??????},

??????immediate:?true

????}

??},

??data()?{

????return?{

??????loading:?true,

??????currentView:?'wallpaper-approve',

??????menuList:?sideBarData,

??????activeNode:?{},

??????path:?'',

????};

??},

??methods:?{

????//??遞歸獲取節(jié)點

????getNode(dataList,?val)?{

??????if?(dataList.length?>?0)?{

????????dataList.forEach(item?=>?{

??????????if?(item.children)?{

????????????this.getNode(item.children,?val)

??????????}?else?{

????????????if?(item.id?===?val)?{

??????????????this.activeNode?=?item;

????????????}

??????????}

????????})

??????}

??????this.path?=?this.activeNode.url;

??????console.log('this.activeNode',?this.activeNode)

????},

????changeviewFun(val)?{

??????this.currentView?=?val;

????}

??},

??mounted()?{

????let?self?=?this

????var?iframe?=?document.getElementById('myIframe');

????if?(!/*@cc_on!@*/0)?{?//if?not?IE

??????iframe.onload?=?function?()?{

????????self.loading?=?false

??????};

????}?else?{

??????iframe.onreadystatechange?=?function?()?{

????????if?(iframe.readyState?==?"complete")?{

??????????self.loading?=?false

????????}

??????};

????}

??}

};

</script>

<style>

.box?{

??width:?100%;

??height:?calc(100%?-?60px);

}

.el-main?{

??background-color:?#f0f2f5?!important;

??color:?#f0f2f5;

}

iframe?{

??width:?100%;

??height:?100%;

??/*?background:?red?!important;?*/

}

</style>


4.配置文件

????{

????????id:'1',

????????name:'一級目錄',

????????icon:?"el-icon-menu",

????????type:'',?????????//?1路由?或??2?iframe

????????children:?[

????????????{

????????????????id:?'1-1',

????????????????name:'二級目錄',

????????????????type:'2',????

????????????????path:'xxx',

????????????????url:??`${BASE_URL}/xxx`

????????????},


????????]

????},

5. 動態(tài)加載菜單收縮字體不顯示問題main.js

collapse-transition

// main.js

import Fragment from ‘vue-fragment’

Vue.use(Fragment.Plugin)


參考:Vue-Components-Library/SidebarItem.vue at master · NLRX-WJC/Vue-Components-Library · GitHub


elementui通過router配置多級導(dǎo)航菜單_瀟藍諾依的博客-CSDN博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妒穴,一起剝皮案震驚了整個濱河市厦章,隨后出現(xiàn)的幾起案子绘雁,更是在濱河造成了極大的恐慌逞姿,老刑警劉巖扫步,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酸员,居然都是意外死亡蜒车,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門幔嗦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酿愧,“玉大人,你說我怎么就攤上這事邀泉℃业玻” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵汇恤,是天一觀的道長庞钢。 經(jīng)常有香客問我,道長因谎,這世上最難降的妖魔是什么基括? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蓝角,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饭冬。我一直安慰自己使鹅,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布昌抠。 她就那樣靜靜地躺著患朱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炊苫。 梳的紋絲不亂的頭發(fā)上裁厅,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音侨艾,去河邊找鬼执虹。 笑死,一個胖子當著我的面吹牛唠梨,可吹牛的內(nèi)容都是我干的袋励。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茬故!你這毒婦竟也來了盖灸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤磺芭,失蹤者是張志新(化名)和其女友劉穎赁炎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钾腺,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡徙垫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了垮庐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片松邪。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哨查,靈堂內(nèi)的尸體忽然破棺而出逗抑,到底是詐尸還是另有隱情,我是刑警寧澤寒亥,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布邮府,位于F島的核電站,受9級特大地震影響溉奕,放射性物質(zhì)發(fā)生泄漏褂傀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一加勤、第九天 我趴在偏房一處隱蔽的房頂上張望仙辟。 院中可真熱鬧,春花似錦鳄梅、人聲如沸叠国。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粟焊。三九已至,卻和暖如春孙蒙,著一層夾襖步出監(jiān)牢的瞬間项棠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工挎峦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留香追,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓坦胶,卻偏偏與公主長得像翅阵,于是被迫代替她去往敵國和親歪玲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容