MyMenu.vue 3.93 KB
<template>
    <el-scrollbar>
    <div class="ams-el-menu">
    <!-- <div class="menu-search">
       <el-select placement="bottom" v-model="searchValue" clearable filterable remote reserve-keyword
        :placeholder="'请输入关键字搜索...'" :remote-method="remoteMethod" @change="selectChange" :loading="loading">
        <template #prefix><i class="el-icon-search"></i></template>
        <el-option v-for="item in menus" :key="item.menuId" :label="item.menuName" :value="item.menuName" />
      </el-select>
    </div>  -->
    
    <el-menu unique-opened :collapse-transition='false' :collapse='$store.state.iscollapse' router :default-active="defaultActive" active-text-color="#409EFF" background-color="#32363f" text-color="#fff">
        <!-- 一级菜单 -->
        <el-sub-menu :index="item.menuId + ''" v-for="item in menus" :key="item.menuId">
            <!-- 一级菜单内容 -->
            <template #title>
                <el-icon v-if="item.menuIcon != null && item.menuIcon !== ''">
                    <el-image style="width: 18px;height: 18px;"  :src="'/imgs/meun/'+item.menuIcon" :fit="'fill'" />
                </el-icon>
                <el-icon v-else><icon-menu /></el-icon>
                <span>{{ item.menuName }}</span>
            </template>
            <!-- 二级菜单 -->
            <el-menu-item :index="subItem.navigateUrl" v-for="subItem in item.childs" :key="subItem.menuId" @click="saveNav(subItem.navigateUrl)">
                <!-- 二级菜单内容 -->
                <template #title>
                    <el-icon v-if="subItem.menuIcon != null && item.menuIcon !== ''">
                        <el-image style="width: 18px;height: 18px;"  :src="'/imgs/meun/'+subItem.menuIcon" :fit="'fill'" />
                    </el-icon>
                    <el-icon v-else><icon-menu /></el-icon>
                    <span>{{ subItem.menuName }}</span>
                </template>
            </el-menu-item>
        </el-sub-menu>
    </el-menu>
</div>
</el-scrollbar>
</template>

<style lang="less" scoped>
    .ams-el-menu {
        width: 100%;
        height: 100%;
        .menu-icon {
            font-size: 18px;
            margin-right: 6px;
        }
    }

    .menu-search {
        padding: 6px 10px;

        ::v-deep(.el-input__wrapper) {
            border-radius: 15px !important;
        }
    }

    :deep(.el-menu) {
        background: rgba(0, 0, 0, 0.0)
    }

        /*隐藏文字*/
    .el-menu--collapse .el-sub-menu__title span {
        display: none;
    }

    /*隐藏 > */
    .el-menu--collapse .el-sub-menu__title .el-sub-menu__icon-arrow {
        display: none;
    }

</style>

<script lang="ts" setup>
    import { useStore } from 'vuex'
    import { computed, ref, getCurrentInstance,onMounted } from 'vue'
    import { onBeforeRouteUpdate } from 'vue-router'
    import {
        Menu as IconMenu
    } from '@element-plus/icons-vue'

    // const searchValue = ref('');
    // const proxy = getCurrentInstance();
    // const props = defineProps(['meun', 'thisIndex']);
    // const emit = defineEmits(['subEvent']);
    // const options = ref([]);
    // const loading = ref(false);

    const store = useStore()
    //定义默认展开
    let defaultActive = ref('/home')

    //定义常量接收仓库中的导航数据
    const menus = computed(() => {       
        return store.state.menus
    })

    onMounted(()=>{
        const isdefaultActive = window.sessionStorage.getItem('activePath') 
        if(isdefaultActive){
            defaultActive.value = window.sessionStorage.getItem('activePath')        
        }     
    })

    //监听当前路由发生变化
    onBeforeRouteUpdate((to, from) => {
        //设置高亮菜单
        defaultActive.value = to.path    
        window.sessionStorage.setItem('activePath',to.path)
    })


    //获取点击菜单的路由地址
    const saveNav=(path)=>{
        defaultActive.value=path
        window.sessionStorage.setItem('activePath',path)
    }

</script>