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

时间:2021-05-26

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

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章