| <template> | 
|   <div class="vol-el-menu"> | 
|     <el-menu | 
|       close="vol-el-menu--vertical" | 
|       :default-openeds="openedIds" | 
|       :default-active="defaultActive" | 
|       :unique-opened="true" | 
|       @select="select" | 
|       :collapse="isCollapse" | 
|       @open="handleOpen" | 
|       @close="handleClose" | 
|       @contextmenu.prevent="bindRightClickMenu" | 
|     > | 
|       <template v-for="item in convertTree(list)"> | 
|         <el-sub-menu | 
|           :key="item.id" | 
|           :index="'' + item.id" | 
|           v-if="item.children.length && (!enable || item.enable == 1)" | 
|         > | 
|           <template #title> | 
|             <i class="menu-icon" :class="item.icon"></i> | 
|             <span> {{ item.name }}</span> | 
|           </template> | 
|           <vol-element-menu-child | 
|             :enable="enable" | 
|             :list="item.children" | 
|           ></vol-element-menu-child> | 
|         </el-sub-menu> | 
|         <template v-else> | 
|           <el-menu-item | 
|             class="menu-item-lv1" | 
|             v-if="!enable || item.enable == 1" | 
|             :key="item.id" | 
|             :index="'' + item.id" | 
|           > | 
|             <i :class="item.icon"></i> | 
|             <span> {{ item.name }}</span> | 
|           </el-menu-item> | 
|         </template> | 
|       </template> | 
|     </el-menu> | 
|   </div> | 
| </template> | 
|   | 
| <script> | 
| import VolElementMenuChild from './VolElementMenuChild'; | 
| import { useRouter } from 'vue-router'; | 
|   | 
| import { | 
|   defineComponent, | 
|   reactive, | 
|   watch, | 
|   ref, | 
|   toRef, | 
|   toRefs, | 
|   getCurrentInstance | 
|   // onMounted, | 
| } from 'vue'; | 
| export default defineComponent({ | 
|   components: { | 
|     'vol-element-menu-child': VolElementMenuChild | 
|   }, | 
|   props: { | 
|     enable: { | 
|       type: Boolean, | 
|       default: false //是否判断enable=1 | 
|     }, | 
|     isCollapse: { | 
|       type: Boolean, | 
|       default: false | 
|     }, | 
|     onSelect: { | 
|       type: Function, | 
|       default: (x) => {} | 
|     }, | 
|     openSelect: { | 
|       //打开的时候是否触发选中事件 | 
|       type: Boolean, | 
|       default: true | 
|     }, | 
|     list: { | 
|       type: Array, | 
|       default: [] | 
|     }, | 
|     rootId: { | 
|       type: String, | 
|       default: '0' | 
|     }, | 
|     currentMenuId: { | 
|       type: Number, | 
|       default: 0 | 
|     } | 
|   }, | 
|   setup(props) { | 
|     // const { list } = toRefs(props); | 
|     //  const treeList = ref([]); | 
|     const getTree = (id, node, data) => { | 
|       if (!node.children) { | 
|         node.children = []; | 
|       } | 
|       data.forEach((x) => { | 
|         if (x.parentId == id && !node.children.some((c) => c.id === x.id)) { | 
|           node.children.push(x); | 
|           getTree(x.id, x, data); | 
|         } | 
|       }); | 
|     }; | 
|     let rootTreeId = !isNaN(props.rootId) ? ~~props.rootId : props.rootId; | 
|     props.list.forEach((x) => { | 
|       if (!x.icon || x.icon.substring(0, 3) != 'el-') { | 
|         x.icon = 'el-icon-menu'; | 
|       } | 
|       x.children = []; | 
|       x.isRoot = x.parentId === rootTreeId; | 
|     }); | 
|     const convertTree = (data) => { | 
|       var root_data = []; | 
|       data.forEach((x) => { | 
|         if (x.parentId === rootTreeId) { | 
|           if (!x.hasOwnProperty('enable')) x.enable = 1; | 
|           root_data.push(x); | 
|           getTree(x.id, x, data); | 
|         } | 
|       }); | 
|       return root_data; | 
|     }; | 
|     const openedIds = reactive([props.currentMenuId]); | 
|     const defaultActive = ref(props.currentMenuId + ''); | 
|     let _base = getCurrentInstance().appContext.config.globalProperties.base; | 
|     watch( | 
|       () => props.currentMenuId, | 
|       (newVal, oldVal) => { | 
|         defaultActive.value = newVal + ''; | 
|         openedIds.splice(0); | 
|         openedIds.push( | 
|           ..._base.getTreeAllParent(newVal, props.list).map((c) => { | 
|             return c.id; | 
|           }) | 
|         ); | 
|       } | 
|     ); | 
|     const router = useRouter(); | 
|     let eventSelect = false; | 
|     const select = (index, path) => { | 
|       if (eventSelect) { | 
|         return; | 
|       } | 
|       eventSelect = true; | 
|       setTimeout(() => { | 
|         eventSelect = false; | 
|       }, 20); | 
|   | 
|       let _item = props.list.find((x) => { | 
|         return x.id == index; | 
|       }); | 
|       props.onSelect(index, _item); | 
|       router.push({ path: _item.path || '' }); | 
|     }; | 
|   | 
|     const handleOpen = (index, path) => { | 
|       if (props.openSelect) { | 
|         select(index, path); | 
|       } | 
|     }; | 
|     const handleClose = () => {}; | 
|   | 
|     /** | 
|      * 菜单导航右键事件 | 
|      * @param {*} enable 是否启用右键事件[true:启用;false:禁用;] | 
|      */ | 
|     const bindRightClickMenu = (enable) => { | 
|       if (!enable) return; | 
|     }; | 
|   | 
|     return { | 
|       // treeList, | 
|       // list, | 
|       select, | 
|       convertTree, | 
|       handleOpen, | 
|       handleClose, | 
|       bindRightClickMenu, | 
|       openedIds, | 
|       defaultActive | 
|     }; | 
|   } | 
| }); | 
| </script> | 
| <style lang="less" scoped> | 
| .vol-el-menu { | 
|   box-sizing: content-box; | 
|   width: 100%; | 
|   .menu-icon { | 
|     font-size: 18px; | 
|     margin-right: 6px; | 
|   } | 
| } | 
| </style> |