效果展示:
一、子組件
<template> <div class="myDiv"> <!-- 這里的listAll用于接收父組件傳遞進(jìn)來的菜單列表 --> <template v-for="(item,i) in listAll"> <!-- 有child就顯示child的下拉型菜單,有小箭頭 --> <el-submenu :index="item.index" :key="i" v-if="item.child.length!=0"> <template slot="title"> <img :src="item.img" alt=""> <span>{{item.title}}</span> </template> <!-- 再次調(diào)用自身組件,傳入子集,進(jìn)行循環(huán)遞歸調(diào)用 --> <Menu :listAll="item.child"></Menu> </el-submenu> <!-- 沒有child,就顯示單個目錄,沒有小箭頭 --> <el-menu-item :index="item.index" v-else :key="i" @click="handleSelect(item.path,item.title,item.index)"> <span slot="title"><img :src="item.img" alt="">{{item.title}}</span> </el-menu-item> </template> </div> </template> <script> export default { name: 'Menu', components: {}, props: ['listAll'], data() { return { realList: this.listAll, } }, methods: { //設(shè)置路由跳轉(zhuǎn) handleSelect(path, name, selfIndex) { this.$router.push( { path: "/" + path, query: { r_n: name, index: selfIndex } } ) }, }, } </script>
二、菜單數(shù)據(jù)準(zhǔn)備
菜單中包含索引,圖片,名稱,跳轉(zhuǎn)路徑,這里我給出一部分?jǐn)?shù)據(jù),路由直接用數(shù)字了,你們最好定義為組件的英文名稱,這樣方便維護(hù)。
export function menuJson() { var data = [{ title: "元數(shù)據(jù)管理", img: "../../../static/img/manager.png", index: '1', child: [ { "title": "元數(shù)據(jù)信息描述管理", "path": "main/02/005", "img": "../../../static/img/manager.png", "index": "1-2", "child": [] }, { "title": "元數(shù)據(jù)分組定義管理", "path": "main/02/007", "img": "../../../static/img/manager.png", "index": "1-3", "child": [] }, { "title": "元數(shù)據(jù)信息管理", "path": "main/02", "img": "../../../static/img/manager.png", "index": "1-1", "child": [ { "title": "采集元數(shù)據(jù)", "path": "main/02/001", "index": "1-1-1", "img": "../../../static/img/blood.png", "child": [] }, { "title": "元模型", "path": "main/02/004", "index": "1-2-1", "img": "../../../static/img/blood.png", "child": [] }, ] }, { "title": "元數(shù)據(jù)統(tǒng)計分析管理", "path": "main/01", "index": "1-4", "img": "../../../static/img/manager.png", "child": [ { "title": "元數(shù)據(jù)變更管理", "path": "main/01/001", "index": "1-4-1", "img": "../../../static/img/blood.png", "child": [] }, { "title": "數(shù)據(jù)地圖", "path": "main/01/002", "index": "1-4-2", "img": "../../../static/img/blood.png", "child": [] }, { "title": "元數(shù)據(jù)分析", "path": "main/01/003", "index": "1-4-3", "img": "../../../static/img/yuanfenxi.png", "child": [ { "title": "血緣分析", "path": "main/01/003/0001", "index": "1-4-3-1", "img": "../../../static/img/blood.png", "child": [] }, { "title": "屬性差異分析", "path": "main/01/003/0003", "index": "1-4-3-2", "img": "../../../static/img/chayi.png", "child": [] }, { "title": "影響分析", "path": "main/01/003/0004", "index": "1-4-3-3", "img": "../../../static/img/impact.png", "child": [] }, ] }, ] }, ] }, { title: "規(guī)則管理", img: "../../../static/img/manager.png", index: '2', child: [ { "title": "數(shù)據(jù)接口定義管理", "index": "2-1", "path": "main/03/001", "img": "../../../static/img/source.png", "child": [] }, { "title": "數(shù)據(jù)轉(zhuǎn)換規(guī)則管理", "index": "2-2", "path": "main/03/004", "img": "../../../static/img/modify.png", "child": [] }, ] } ] return data }
三、父組件調(diào)用
<template> <div class="content menu"> <div :style="{height:scrollHeight+'px'}"> <el-col :span="24"> <el-menu :default-active="activeIndex" :default-openeds="defalutIndex" background-color="#003289" text-color="#fff" active-text-color="#ffd04b"> //調(diào)用子組件 <Menu :listAll="listAll"></Menu> </el-menu> </el-col> </div> </div> </template> <script> import Menu from './menu' import { menuJson } from '../../assets/common/http' //調(diào)用js文件中的菜單數(shù)據(jù) export default { name: "Menus", mixins: [mixin], components: { Menu }, data() { return { scrollHeight: 400, listAll: [], activeIndex: "-1", defalutIndex: [] } }, created() { //設(shè)置點擊菜單的索引,可以使得刷新后菜單仍保持原來查看的頁面 this.activeIndex = String(this.$route.query.index); this.listAll = menuJson() //通過調(diào)用函數(shù)menuJson,獲取菜單 }, watch: { $route(to, from) { this.activeIndex = this.$route.query.index; } }, } </script> <style scoped> @color: #003289; .menu { background: @color; > div { width: 100%; padding-top: 20px; // height: 100%; color: #ffffff; overflow-y: scroll; overflow-x: hidden; &::-webkit-scrollbar { display: none; } h1 { font-size: 20px; text-align: center; padding: 15px 0 25px 0; } } } .el-menu-demo { position: absolute; height: 58px !important; left: 25%; top: 0%; } </style>
補(bǔ)充(面包屑的展示):
有菜單,肯定需要面包屑的展示,例如
這里我用的方法是,根據(jù)當(dāng)前頁面名稱,從樹形菜單數(shù)據(jù)中查找它的所有父級來實現(xiàn)面包屑導(dǎo)航欄的展示。
html:
<el-breadcrumb separator-class="el-icon-arrow-right"> <el-breadcrumb-item v-for="(item,index) in listMenu" :key="index">{{item}}</el-breadcrumb-item> </el-breadcrumb> methods:
methods: { //獲取樹形數(shù)據(jù)的某個元素的所有父節(jié)點 getTreePath(tree, func, path) { if (!tree) return [] for (const data of tree) { // 這里按照你的需求來存放最后返回的內(nèi)容吧 //這里的title是我的菜單數(shù)據(jù)里面的名稱字段,你可以改成你的 path.push(data.title) if (func(data)) return path if (data.child) { //獲取到子數(shù)據(jù),遞歸調(diào)用 const findChildren = this.getTreePath(data.child, func, path) if (findChildren.length) return findChildren } path.pop() } return [] }, // 獲取面包屑 getNavList() { var name = this.$route.query.r_n //先獲取當(dāng)前路由名稱 var tree = menuJson() //獲取菜單數(shù)據(jù),menuJson這個函數(shù)上面用了,返回的事菜單數(shù)據(jù) this.path = [] //path用于存放所有父級,調(diào)用前需要清空 //data => data.title === name查找數(shù)據(jù)中的title是否和當(dāng)前路由名稱相等 this.getTreePath(tree, data => data.title === name, this.path) this.listMenu = this.path //找到之后賦值給面包屑路由數(shù)組 console.log(this.listMenu) } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/127672.html
摘要:簡介最近寫了一個基于權(quán)限管理系統(tǒng)的后臺模板,包含了正常項目開發(fā)所需的框架功能,開發(fā)者使用的時候只需要專注于項目的業(yè)務(wù)邏輯就好。同時接下來會讓你擁有一個自己完全掌控的框架。 簡介 最近寫了一個基于vue2.0+element-ui權(quán)限管理系統(tǒng)的后臺模板,包含了正常項目開發(fā)所需的框架功能,開發(fā)者使用的時候只需要專注于項目的業(yè)務(wù)邏輯就好。同時接下來會讓你擁有一個自己完全掌控的框架。 源碼地址...
摘要:造成這個問題的原因是多級路由組件嵌套。當(dāng)點擊菜單的時候,由于設(shè)置的不緩存,所以導(dǎo)致組件被銷毀這就是為什么會失效的根本原因。既然這樣的話,顯示的菜單保留多級的,實際的弄成一級,將顯示菜單和業(yè)務(wù)分離開。 一般的后臺管理系統(tǒng)功能都比較繁多,存在有多級菜單的需求,但是在這種項目里往往keep-alive的表現(xiàn)卻非常不穩(wěn)定,有時候某個頁面可以緩存,但是點幾下就發(fā)現(xiàn)緩存丟了;有時候不知道怎么回事又...
摘要:但是有邊框,不好看啊再次美化使用使用圖標(biāo)庫安裝這里主要貼一下的改動,其他的代碼就不貼了看下效果圖標(biāo)什么的都有了。另外文件需要加上看看效果點擊菜單,路徑跳轉(zhuǎn),并且每次都是單獨去加載路由的文件。 做完這個demo后,我體會到,Vue組件化,webpack, Vue-router等,并不是很難學(xué)習(xí),你需要的只是拿起斧頭的勇氣在做demo的過程中,我遇到一個問題,就是vue-router懶加載...
摘要:最近在嘗試著封裝一個框架,礙于種種原因,先從簡單的入手吧。基于和封裝的框架,集成數(shù)據(jù)存儲字體圖標(biāo)庫拓展語言網(wǎng)絡(luò)請求等模塊,為了讓業(yè)務(wù)開發(fā)更專注于數(shù)據(jù)驅(qū)動。 最近在嘗試著封裝一個框架,礙于種種原因,先從簡單的入手吧。基于vue和elementUI封裝的框架,集成 數(shù)據(jù)存儲localforage、字體圖標(biāo)庫font-awesome、css拓展語言scss、網(wǎng)絡(luò)請求axios等模塊,為了讓業(yè)...
摘要:基本設(shè)計和分析前端服務(wù)端主要功能打開思否頁面,根據(jù)頁面的功能點,設(shè)計出相關(guān)的數(shù)據(jù)表,和管理系統(tǒng)需要的相關(guān)頁面。 本文主要想對前端權(quán)限管理功能實現(xiàn)做一個分享,所以并不會對后臺管理的框架結(jié)構(gòu)做太詳細(xì)介紹,如果有朋友對其他有興趣可以留言。 基本設(shè)計和分析 前端 vue + elementui 服務(wù)端: node + mysql + nginx 主要功能 打開思否頁面,根據(jù)頁面的功能點,設(shè)...
閱讀 547·2023-03-27 18:33
閱讀 732·2023-03-26 17:27
閱讀 630·2023-03-26 17:14
閱讀 591·2023-03-17 21:13
閱讀 520·2023-03-17 08:28
閱讀 1801·2023-02-27 22:32
閱讀 1292·2023-02-27 22:27
閱讀 2177·2023-01-20 08:28