欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

vue左侧菜单,树形图递归实现代码

程序员文章站 2022-06-23 12:11:13
学习vue有一段时间了,最近使用vue做了一套后台管理系统,左侧菜单需求是这样的,可以多层,数据由后台传递。也因为自己对官方文档的不熟悉使得自己踩了不少坑,今天写出来和大家...

学习vue有一段时间了,最近使用vue做了一套后台管理系统,左侧菜单需求是这样的,可以多层,数据由后台传递。也因为自己对官方文档的不熟悉使得自己踩了不少坑,今天写出来和大家一起分享。

效果图如下所示:

vue左侧菜单,树形图递归实现代码

先说说遇到的坑,由于是子父组件,当时传递使用的是子父组件的传递,但是这时候只能获取到第一层的数据,第二层往后获取不到数据,踩了一下午坑以后才知道,子组件使用了递归组件,这时候他已经不能往父组件传递了,子传父,只能逐层传递这时候已经隔层了,所以我使用了非子父组件传递,两个页面都引入bus.js,这里不懂的请百度。

bus.js

import vue from 'vue'
export default new vue

父组件内容

<ul v-for="menuitem in themodel">
<my-tree :model="menuitem"></my-tree>
</ul>

模拟后台数据

themodel:[{
 'id': '1',
 'menuname': '导航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': '导航2',
 'menucode': '10',
 'childmenus':[]
}],

父组件引入子组件

import mytree from './treemenu.vue'
export default {
  components: {
  mytree
  },
}

父组件接受子组件传递的数据

bus.$on("childevent", function(transmit) {})

下面是子组件内容,子组件名称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>对应起来

总结

以上所述是小编给大家介绍的vue左侧菜单,树形图递归实现代码,希望对大家有所帮助