父组件中:
<el-menu
class="el-menu-vertical-demo"
:default-active="$route.path"
router
exact
>
<tree :docList="docList" ></tree>
</el-menu>
import tree from './components/tree.vue'
递归菜单子组件:
<div v-for="item in docList" :key="item.document_id">
<el-menu-item
v-if="item.children.length==0"
:index="item.path"
@click="selectMenu(item)"
>
</el-menu-item>
<el-sub-menu v-else :index="item.path">
<template #title >
<div style="width:100%" @mouseenter="item.options=true" @mouseleave="item.options=false">
<span >{{item.title}}</span>
</div>
</template>
//递归自己
//v-bind="$attrs" 设置这个属性,可以讲子菜单的时间递归
<tree v-bind="$attrs" :docList="item.children"></tree>
</el-sub-menu>
</div>
export default ({
name: 'Tree',
props: ['docList'],
setup(props, context) {
},
})
</script>
通过鼠标移入移出实现菜单的增删改查:
<template>
<div>
<div v-for="item in docList" :key="item.document_id">
<el-menu-item v-if="item.children.length==0" :index="item.path"
@click="selectMenu(item)"
@mouseenter="item.options=true"
@mouseleave="item.options=false"
>
<span>{{item.title}}</span>
<span v-if="item.options">
<!-- <a v-if="item.is_leaf==0" @click.stop="addDoc('directory', item)"> +目录 </a>
<a v-if="item.is_leaf==0" @click.stop="addDoc('doc', item)"> +文档 </a>
<a @click.stop="updateDoc(item)"> 修改 </a>
<a @click.stop="deleteDoc(item)"> 删除 </a> -->
</span>
</el-menu-item>
<el-sub-menu v-else :index="item.path">
<template #title >
<div style="width:100%" @mouseenter="item.options=true" @mouseleave="item.options=false">
<span >{{item.title}}</span>
<span v-if="item.options">
<!-- <a v-if="item.is_leaf==0" @click.stop="addDoc('directory', item)"> +目录 </a>
<a v-if="item.is_leaf==0" @click.stop="addDoc('doc', item)"> +文档 </a>
<a @click.stop="updateDoc(node, item)"> 修改 </a>
<a @click.stop="deleteDoc(item)"> 删除 </a> -->
</span>
</div>
</template>
<tree v-bind="$attrs" :docList="item.children"></tree>
</el-sub-menu>
</div>
</div>
</template>
<script>
import { getCurrentInstance } from 'vue'
export default ({
name: 'Tree',
props: ['docList'],
setup(props, context) {
let { proxy } = getCurrentInstance()
const selectMenu = (item) => {
context.emit('menuItem', item)
}
// 修改
const updateDoc = (item) => {
context.emit('updateDoc', item)
}
// 删除
const deleteDoc = (item) => {
context.emit('deleteDoc', item)
}
// 新增
const addDoc = (type, item) => {
let data = {
type: type,
item: item
}
context.emit('addDoc', data)
}
return {
selectMenu,
deleteDoc,
updateDoc,
addDoc
}
},
})
</script>