当前位置: 移动技术网 > IT编程>脚本编程>vue.js > vue左侧菜单,树形图递归实现代码

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

2018年09月23日  | 移动技术网IT编程  | 我要评论

曹先生论股,旅游必带物品,远东星空影院

学习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左侧菜单,树形图递归实现代码,希望对大家有所帮助

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网