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


Posted in Javascript onAugust 24, 2018

学习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左侧菜单,树形图递归实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript isPrototypeOf和hasOwnProperty使用区别
Mar 04 Javascript
再谈javascript面向对象编程
Mar 18 Javascript
Python脚本后台运行的几种方式
Mar 09 Javascript
jQuery模拟淘宝购物车功能
Feb 27 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
Mar 16 Javascript
ES6学习教程之Map的常用方法总结
Aug 03 Javascript
对Angular中单向数据流的深入理解
Mar 31 Javascript
vue-cli2.9.3 详细教程
Apr 23 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
Nov 10 Javascript
30分钟快速实现小程序语音识别功能
Nov 27 Javascript
JS基于ES6新特性async await进行异步处理操作示例
Feb 02 Javascript
node使用request请求的方法
Dec 20 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
Aug 24 #jQuery
element-ui中的select下拉列表设置默认值方法
Aug 24 #Javascript
vue 登录滑动验证实现代码
Aug 24 #Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
Aug 24 #Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
Aug 24 #Javascript
element-ui表格数据转换的示例代码
Aug 24 #Javascript
element-ui表格列金额显示两位小数的方法
Aug 24 #Javascript
You might like
PHP中使用Imagick实现各种图片效果实例
2015/01/21 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
PHP脚本自动识别验证码查询汽车违章
2016/12/20 PHP
通过js动态操作table(新增,删除相关列信息)
2012/05/23 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
js判断iframe内的网页是否滚动到底部触发事件
2014/03/18 Javascript
js全选实现和判断是否有复选框选中的方法
2015/02/17 Javascript
第四章之BootStrap表单与图片
2016/04/25 Javascript
使用Ajax与服务器(JSON)通信实例
2016/11/04 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
jQuery+PHP+Mysql实现抽奖程序
2020/04/12 jQuery
Vue使用mixins实现压缩图片代码
2018/03/14 Javascript
React中的render何时执行过程
2018/04/13 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
Python制作简单的网页爬虫
2015/11/22 Python
利用Python写一个爬妹子的爬虫
2018/06/08 Python
解决安装python库时windows error5 报错的问题
2018/10/21 Python
Python logging设置和logger解析
2019/08/28 Python
利用python绘制正态分布曲线
2021/01/04 Python
Madewell美德威尔美国官网:美国休闲服饰品牌
2016/11/25 全球购物
Champs Sports加拿大:北美最大的以商场为基础的专业运动鞋和服装零售商之一
2018/05/01 全球购物
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
Ajax的工作原理
2015/12/04 面试题
团日活动策划书
2014/02/01 职场文书
幼儿教师求职信
2014/05/24 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
员工工作能力评语
2014/12/31 职场文书
财务稽核岗位职责
2015/04/13 职场文书
2019最新校园运动会广播稿!
2019/06/28 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python