<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> 
 |