|
@@ -1,26 +1,16 @@
|
|
|
<template>
|
|
|
- <div class="hc-horizontal-menu-box">
|
|
|
- <template v-for="(item,index) in datas">
|
|
|
- <n-popover trigger="hover" placement="bottom" v-if="item.children?.length > 0">
|
|
|
- <template #trigger>
|
|
|
- <div class="hc-horizontal-menu-item" :class="curKey === item.key?'cur':''" @click="menuClick(item,index)">
|
|
|
- <n-badge :value="20" processing v-if="item.key==='tasks'">
|
|
|
- {{item.name}}
|
|
|
- </n-badge>
|
|
|
- <template v-else>
|
|
|
- {{item.name}}
|
|
|
- </template>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <slot :name="item.key" v-bind="item"/>
|
|
|
- </n-popover>
|
|
|
- <div class="hc-horizontal-menu-item" :class="curKey === item.key?'cur':''" @click="menuClick(item,index)" v-else>{{item.name}}</div>
|
|
|
- </template>
|
|
|
- </div>
|
|
|
+ <el-menu :default-active="curKey" class="hc-aside-menu" :collapse="isCollapse">
|
|
|
+ <el-menu-item index="home-index">
|
|
|
+ <HcIcon name="home" class="hc-menu-icon" :ui="curKey === 'home-index'?'fill':''"/>
|
|
|
+ <template #title>首页</template>
|
|
|
+ </el-menu-item>
|
|
|
+ <MenuItem :datas="datas" @change="MenuClick"/>
|
|
|
+ </el-menu>
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
|
import {ref,watch} from "vue";
|
|
|
+import MenuItem from "./MenuItem.vue"
|
|
|
const props = defineProps({
|
|
|
datas: {
|
|
|
type: Array,
|
|
@@ -28,81 +18,67 @@ const props = defineProps({
|
|
|
},
|
|
|
cur: {
|
|
|
type: String,
|
|
|
- default: ''
|
|
|
- }
|
|
|
+ default: 'home-index'
|
|
|
+ },
|
|
|
+ collapse: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false
|
|
|
+ },
|
|
|
})
|
|
|
|
|
|
+//初始变量
|
|
|
const curKey = ref(props.cur);
|
|
|
+const isCollapse = ref(props.collapse);
|
|
|
|
|
|
-watch(() => props.cur, (cur) => {
|
|
|
+//监听
|
|
|
+watch(() => [
|
|
|
+ props.cur,
|
|
|
+ props.collapse
|
|
|
+], ([cur,collapse]) => {
|
|
|
curKey.value = cur
|
|
|
+ isCollapse.value = collapse
|
|
|
})
|
|
|
|
|
|
+//事件
|
|
|
const emit = defineEmits(['change'])
|
|
|
-const menuClick = (item,index) => {
|
|
|
- if (item?.children?.length <= 0) {
|
|
|
- curKey.value = item?.key||'';
|
|
|
- emit('change', {item,index})
|
|
|
- }
|
|
|
+const MenuClick = (item) => {
|
|
|
+ console.log(item)
|
|
|
+ curKey.value = item?.key || '';
|
|
|
+ emit('change', item)
|
|
|
}
|
|
|
</script>
|
|
|
|
|
|
-<style lang="scss" scoped>
|
|
|
-.hc-horizontal-menu-box {
|
|
|
- position: relative;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- height: 100%;
|
|
|
- flex: auto;
|
|
|
- justify-content: flex-end;
|
|
|
- .hc-horizontal-menu-item {
|
|
|
- cursor: pointer;
|
|
|
- padding: 0 20px;
|
|
|
- height: 100%;
|
|
|
- position: relative;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- font-size: 16px;
|
|
|
- overflow-y: hidden;
|
|
|
- transition: color 0.3s;
|
|
|
- color: inherit;
|
|
|
- &:before {
|
|
|
- bottom: 0;
|
|
|
- opacity: 0;
|
|
|
- height: 4px;
|
|
|
- content: "";
|
|
|
- padding: 0 32px;
|
|
|
- position: absolute;
|
|
|
- border-radius: 5px;
|
|
|
- background: var(--hc-primary);
|
|
|
- transition: opacity 0.3s;
|
|
|
- }
|
|
|
- &:hover {
|
|
|
- color: var(--hc-primary);
|
|
|
- }
|
|
|
- &.cur {
|
|
|
- font-weight: 500;
|
|
|
- color: var(--hc-primary);
|
|
|
- &:before {
|
|
|
- opacity: 1;
|
|
|
- }
|
|
|
- }
|
|
|
+<style lang="scss">
|
|
|
+.hc-aside-menu.el-menu {
|
|
|
+ --el-menu-bg-color: #333333;
|
|
|
+ --el-menu-text-color: #ffffff;
|
|
|
+ --el-menu-active-color: #ffffff;
|
|
|
+ --el-menu-hover-bg-color: initial;
|
|
|
+ --el-menu-item-font-size: 16px;
|
|
|
+ --el-menu-item-height: 48px;
|
|
|
+ border-right: 0;
|
|
|
+ &.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-menu-item,
|
|
|
+ &.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-menu-item-group__title,
|
|
|
+ &.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-sub-menu__title {
|
|
|
+ white-space: nowrap;
|
|
|
+ padding-left: 20px;
|
|
|
}
|
|
|
-}
|
|
|
-
|
|
|
-.home-theme-1, .home-theme-2, .home-theme-3 {
|
|
|
- .hc-horizontal-menu-box .hc-horizontal-menu-item {
|
|
|
- &:before {
|
|
|
- background: white;
|
|
|
+ .el-menu-item, .el-sub-menu {
|
|
|
+ margin: 15px 0 0 20px;
|
|
|
+ border-radius: 50px 0 0 50px;
|
|
|
+ .hc-menu-icon {
|
|
|
+ font-size: 22px;
|
|
|
+ margin-right: 10px;
|
|
|
}
|
|
|
- &:hover {
|
|
|
- color: white;
|
|
|
- background-color: rgba(255, 255, 255, 0.1);
|
|
|
+ }
|
|
|
+ .el-menu-item.is-active {
|
|
|
+ background-color: var(--el-color-primary);
|
|
|
+ box-shadow: 4px 4px 8px 0 rgba(0, 0, 0, 0.3), 0 -6px 8px 0 #707070;
|
|
|
+ &::before {
|
|
|
+ content: '';
|
|
|
}
|
|
|
- &.cur {
|
|
|
- color: white;
|
|
|
- background-color: rgba(255, 255, 255, 0.1);
|
|
|
+ &::after {
|
|
|
+ content: '';
|
|
|
}
|
|
|
}
|
|
|
}
|