vue左側(cè)菜單,樹形圖遞歸實(shí)現(xiàn)代碼
學(xué)習(xí)vue有一段時(shí)間了,最近使用vue做了一套后臺(tái)管理系統(tǒng),左側(cè)菜單需求是這樣的,可以多層,數(shù)據(jù)由后臺(tái)傳遞。也因?yàn)樽约簩?duì)官方文檔的不熟悉使得自己踩了不少坑,今天寫出來和大家一起分享。
效果圖如下所示:

先說說遇到的坑,由于是子父組件,當(dāng)時(shí)傳遞使用的是子父組件的傳遞,但是這時(shí)候只能獲取到第一層的數(shù)據(jù),第二層往后獲取不到數(shù)據(jù),踩了一下午坑以后才知道,子組件使用了遞歸組件,這時(shí)候他已經(jīng)不能往父組件傳遞了,子傳父,只能逐層傳遞這時(shí)候已經(jīng)隔層了,所以我使用了非子父組件傳遞,兩個(gè)頁面都引入bus.js,這里不懂的請(qǐng)百度。
bus.js
import Vue from 'vue' export default new Vue
父組件內(nèi)容
<ul v-for="menuItem in theModel"> <my-tree :model="menuItem"></my-tree> </ul>
模擬后臺(tái)數(shù)據(jù)
theModel:[{
'id': '1',
'menuName': '導(dǎo)航1',
'menuCode': '10',
'menuUrl':'',
'childMenus': [
{
'menuName': '用戶管理',
'menuCode': '11',
'menuUrl':'/home',
'menuPath':'',
'childMenus':[{
'menuName': '11111',
'menuCode': '12',
'menuUrl':'/systemjuri',
'menuPath':'',
'childMenus': []
}]
},
{
'menuName': '角色管理',
'menuCode': '12',
'menuUrl':'/systemjuri',
'menuPath':'',
'childMenus': []
},
{
'menuName': '菜單管理',
'menuUrl':'/systemmenu',
'menuCode': '13',
'menuPath':'http://10.63.195.214:8080/menuManage/html/index_3.html',
'childMenus':[]
}]
},{
'id': '1',
'menuName': '導(dǎo)航2',
'menuCode': '10',
'childMenus':[]
}],
父組件引入子組件
import myTree from './treeMenu.vue'
export default {
components: {
myTree
},
}
父組件接受子組件傳遞的數(shù)據(jù)
bus.$on("childEvent", function(transmit) {})
下面是子組件內(nèi)容,子組件名稱treeMenu,name: 'treeMenu',
<template>
<li>
<span @click="toggle(model.menuName,model.menuUrl,model.menuPath)">
<i v-if="!isFolder" class="icon file-text">●</i>
{{ model.menuName }}
<i v-if="isFolder" class="icon" :class="[open ? 'folder-open': 'folder']"></i>
</span>
<ul v-show="open" v-if="isFolder">
<tree-menu v-for="item in model.childMenus" :model="item" :key="item.menuId"></tree-menu>
</ul>
</li>
</template>
<script>
import bus from "./../../../static/js/bus";
export default {
name: 'treeMenu',
props: ['model'],
data() {
return {
open: false,
}
},
computed: {
isFolder() {
return this.model.childMenus && this.model.childMenus.length
}
},
methods: {
toggle(msg,menuUrl,menuPath) {
if (this.isFolder) {
this.open = !this.open
}
var json = { msg: msg, menuUrl: menuUrl,menuPath:menuPath };
bus.$emit("childEvent", json)
},
}
}
</script>
<style>
ul {
list-style: none;
}
i.icon {
display: inline-block;
width: 15px;
height: 15px;
background-repeat: no-repeat;
vertical-align: middle;
float: right;
margin-top: 17px;
margin-right:30px;
}
.icon.folder {
background-image: url('./homeimg/left_1.png');
}
.icon.folder-open {
background-image: url('./homeimg/dowm_1.png');
}
.icon.file-text {
}
ul li ul li .icon.folder {
background-image: url('./homeimg/left_2.png');
}
ul li ul li .icon.folder-open {
background-image: url('./homeimg/down_2.png');
}
.tree-menu li {
line-height: 50px;
}
span{
display: block;
width: 100%;
height: 100%;
}
ul{
padding-left:10px;
}
ul li span{
text-indent: 10px;
}
ul li ul{
background:#ebf1f8;
color:#1457a7;
}
li:hover{
cursor:pointer;
}
</style>
由于用了遞歸組件所以name需要和<tree-menu>對(duì)應(yīng)起來
總結(jié)
以上所述是小編給大家介紹的vue左側(cè)菜單,樹形圖遞歸實(shí)現(xiàn)代碼,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- vue遞歸組件實(shí)戰(zhàn)之簡單樹形控件實(shí)例代碼
- Vue遞歸組件+Vuex開發(fā)樹形組件Tree--遞歸組件的簡單實(shí)現(xiàn)
- Vue遞歸實(shí)現(xiàn)樹形菜單方法實(shí)例
- vue用遞歸組件寫樹形控件的實(shí)例代碼
- 用 Vue.js 遞歸組件實(shí)現(xiàn)可折疊的樹形菜單(demo)
- Vue.js遞歸組件構(gòu)建樹形菜單
- vuejs使用遞歸組件實(shí)現(xiàn)樹形目錄的方法
- Vue2遞歸組件實(shí)現(xiàn)樹形菜單
- Vue.js 遞歸組件實(shí)現(xiàn)樹形菜單(實(shí)例分享)
- vue遞歸實(shí)現(xiàn)樹形組件
相關(guān)文章
淺談Vue使用Elementui修改默認(rèn)的最快方法
這篇文章主要介紹了淺談Vue使用Elementui修改默認(rèn)的最快方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
使用Webstorm調(diào)試Vue代碼詳細(xì)圖文教程
WebStorm是一款優(yōu)秀的前端開發(fā)IDE,之前一直可以調(diào)試Vue項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于使用Webstorm調(diào)試Vue代碼的詳細(xì)圖文教程,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05
vue中使用極驗(yàn)驗(yàn)證碼的方法(附demo)
這篇文章主要介紹了vue中使用極驗(yàn)驗(yàn)證碼的方法(附demo)本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
Vue預(yù)渲染:prerender-spa-plugin生成靜態(tài)HTML與vue-meta-info更新meta
Vue.js中,prerender-spa-plugin和vue-meta-info插件的結(jié)合使用,提供了解決SEO問題的方案,prerender-spa-plugin通過預(yù)渲染技術(shù)生成靜態(tài)HTML,而vue-meta-info則能動(dòng)態(tài)管理頁面元數(shù)據(jù),本文將探討如何使用這兩個(gè)工具優(yōu)化Vue.js項(xiàng)目的SEO表現(xiàn),包括安裝、配置及注意事項(xiàng)2024-10-10
vue3中$attrs的變化與inheritAttrs的使用詳解
$attrs現(xiàn)在包括class和style屬性。?也就是說在vue3中$listeners不存在了,vue2中$listeners是單獨(dú)存在的,在vue3?$attrs包括class和style屬性,?vue2中?$attrs?不包含class和style屬性,這篇文章主要介紹了vue3中$attrs的變化與inheritAttrs的使用?,需要的朋友可以參考下2022-10-10
elementUI?checkBox報(bào)錯(cuò)Cannot read property &ap
這篇文章主要為大家介紹了elementUI?checkBox報(bào)錯(cuò)Cannot read property 'length' of undefined的解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
vue+vant移動(dòng)端顯示table表格加橫向滾動(dòng)條效果
vant移動(dòng)端顯示table效果,增加復(fù)選框,可以進(jìn)行多選和全選,加橫向滾動(dòng)條,可以看全部內(nèi)容,下面通過本文給大家分享vue+vant移動(dòng)端顯示table表格加橫向滾動(dòng)條效果,感興趣的朋友跟隨小編一起看看吧2024-06-06

