无限级菜单
点击每项隐藏或显示每项的后代子菜单
<script setup>
let menus = defineProps({
'menu': Array
})
let hide = (item) => {
item['show'] = true
}
</script>
<template>
<div v-for="(item,index) in menus.menu" style="margin-left: 0.6rem" @click="hide(item)"
:class="item['show']?'show':'hidden'">
<div class="item">{{ item['name'] }}
<div v-if="item['children'].length>0">
<IMenuItem :menu="item['children']"/>
</div>
</div>
</div>
</template>
<style scoped lang="scss">
.item .hidden {
visibility: visible;
}
.item .show {
visibility: hidden;
}
</style>
这是另一个vue文件
<script setup>
import {reactive, ref} from "vue";
import IMenuItem from "@/pages/IMenuItem.vue";
let json = reactive([
{
name: '一级',
children: [
{
name: '二级',
children: [
{
name: '三级',
children: [
{
name: '四级',
children: []
}
]
}
]
},
{
name: '二级',
children: []
}
]
},
{
name: '一级',
children: [
{
name: '二级',
children: [
{
name: '三级',
children: [
{
name: '四级',
children: []
}
]
}
]
},
{
name: '二级',
children: []
}
]
},
])
</script>
<template>
<IMenuItem :menu="json"/>
</template>
<style scoped lang="scss">
</style>
以下是我实现的方法
let hide = (item, event) => {
event.stopPropagation()
let childMenus = event.target.querySelectorAll(".item");
if (item['show']) {
childMenus.forEach(childMenu => {
childMenu.style.visibility = "visible";
})
} else {
childMenus.forEach(childMenu => {
childMenu.style.visibility = "hidden";
})
}
item['show'] = !item['show']
}
两种方式:
一:纯
CSS
控制因为你加了scoped
,所以你需要.item ::v-deep .hidden
这样来设置后代元素二:增加一个
prop
,把item.show
传入子组件来让子组件设置相应class