[vue]多级菜单的实现

效果图:

效果说明:
点击父菜单,如果有子菜单就在其左侧显示出子菜单

思路:
通过递归的方式。

代码:
子组件 MenuItem

// 子组件代码
<template>
    <li>
        <span @click="toggle(model)"> {{ isFolder? "<" + model.menuName : model.menuName   }}</span>
        <ul v-if="isFolder" v-show="open" style="position: absolute;left: -120px;top: 0px; width:100px; background-color: cadetblue;">
            <menuItems v-for="(item, index) in model.childTree" :model="item" :key="index"></menuItems>
        </ul>
    </li>
</template>

<script type="text/javascript">
    export default {
        // 组件递归必要条件,name属性,然后在标签就可以通过name直接使用自己
        name: 'menuItems',
        props: ['model',],
        data() {
            return {
				 // 控制子列表的显示隐藏
				open: false
			}
        },
        computed: {
            // 是否还有子列表需要渲染,作为v-if的判断条件
            isFolder() {
                return this.model.childTree && this.model.childTree.length
            }
        },
        methods: {
            // 切换列表显示隐藏的方法
            toggle(mode) {
				
                if(this.isFolder) {
                    this.open = !this.open
                }
	/* 			if(mode.id != undefined && this.open){
					this.open = false;
				} */
            },
        }
    }
</script>
<style scoped>
	ul,li {
		list-style: none;
	}
</style>

父组件调用子组件

<template>
	<!--https://www.jb51.net/css/378895.html-->
	<view>
		<div style="position: absolute;left:400px;">
			<ul>
				<menu-item v-for="(model, index) in list" :model="model" :key="index"></menu-item>
			</ul>
		</div>
	</view>
	
</template>

<script>
	import MenuItem from "../../components/MenuItem.vue"
	export default {
		components:{
			MenuItem
		},
		computed:{
			
		},
		data() {
			return {
				list: [ // 将菜单数据传到菜单组件中就行了
				{
				    "id": "1",
				    "menuName": "菜单1",
				    "childTree": [{
				        "menuName": "项目进度",
				        "childTree": [{
				            "menuName": "项目一",
				            "childTree": [{ "menuName": "详细信息" }]
				        }]
				    }, {
				        "menuName": "任务安排"
				    }]
				}, 
				{
				    "id": "2",
				    "menuName": "菜单2"
				}, 
				{
				    "id": "3",
				    "menuName": "菜单3"
				}]
			};
		},
		methods:{
		}
	}
</script>

<style>	
			ul,li{
				list-style: none !important;
			}
</style>

结语:
效果图中是将子菜单显示在父菜单的左侧,也可以直接通过把下面的样式删除,让子菜单显示子父菜单的右侧 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值