121 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Vue
		
	
	
<template>
 | 
						|
  <el-aside
 | 
						|
    class="sidebar-container"
 | 
						|
    width="190px"
 | 
						|
    :collapsed="isCollapsed"
 | 
						|
    :class="isCollapsed && 'collapsed'"
 | 
						|
  >
 | 
						|
    <el-scrollbar class="scrollbar-wrapper">
 | 
						|
      <BaseMenu
 | 
						|
        v-bind="menuProps"
 | 
						|
        class="sidebar-menu"
 | 
						|
        @select="selectItem"
 | 
						|
      ></BaseMenu>
 | 
						|
    </el-scrollbar>
 | 
						|
    <OperateBtn class="operate" @click="$emit('toggleCollapsed')"> </OperateBtn>
 | 
						|
  </el-aside>
 | 
						|
</template>
 | 
						|
 | 
						|
<script>
 | 
						|
import { computed } from "vue";
 | 
						|
import BaseMenu from "./BaseMenu.vue";
 | 
						|
import OperateBtn from "./OperateBtn.vue";
 | 
						|
import useMenuColorConfig from "./useMenuColorConfig";
 | 
						|
import useBreakPoint from "./useBreakPoint";
 | 
						|
 | 
						|
export default {
 | 
						|
  components: { BaseMenu, OperateBtn },
 | 
						|
  props: {
 | 
						|
    isCollapsed: {
 | 
						|
      type: Boolean,
 | 
						|
      default: false
 | 
						|
    },
 | 
						|
    menuData: {
 | 
						|
      type: Array
 | 
						|
    },
 | 
						|
    isLimitLevel: {
 | 
						|
      type: Boolean,
 | 
						|
      default: false
 | 
						|
    },
 | 
						|
    basePath: {
 | 
						|
      type: String,
 | 
						|
      default: "/"
 | 
						|
    },
 | 
						|
    matchPath: {
 | 
						|
      type: String,
 | 
						|
      default: ""
 | 
						|
    },
 | 
						|
    selectItem: {
 | 
						|
      type: Function
 | 
						|
    }
 | 
						|
  },
 | 
						|
  setup(props, { emit }) {
 | 
						|
    const { menuColorConfig } = useMenuColorConfig();
 | 
						|
    const menuProps = computed(() => {
 | 
						|
      const { menuData, isLimitLevel, basePath, matchPath, isCollapsed } =
 | 
						|
        props;
 | 
						|
      return {
 | 
						|
        menuData,
 | 
						|
        isLimitLevel,
 | 
						|
        basePath,
 | 
						|
        matchPath,
 | 
						|
        collapse: isCollapsed,
 | 
						|
        ...unref(menuColorConfig),
 | 
						|
        mainMenu: true,
 | 
						|
        uniqueOpened: true
 | 
						|
      };
 | 
						|
    });
 | 
						|
    useBreakPoint('xl', emit)
 | 
						|
    return {
 | 
						|
      menuProps
 | 
						|
    };
 | 
						|
  }
 | 
						|
};
 | 
						|
</script>
 | 
						|
<style lang="scss" scoped>
 | 
						|
.sidebar-container {
 | 
						|
  position: relative;
 | 
						|
  background: var(--custom-base-color-background);
 | 
						|
  color: var(--custom-base-color-text);
 | 
						|
  z-index: 3;
 | 
						|
  transition: width 0.2s;
 | 
						|
  overflow: hidden;
 | 
						|
  height: 100%;
 | 
						|
  &.collapsed {
 | 
						|
    width: 48px !important;
 | 
						|
    overflow: initial;
 | 
						|
    .operate {
 | 
						|
      position: absolute;
 | 
						|
      left: 25px;
 | 
						|
      transform: rotate(90deg);
 | 
						|
      transition: left 0.1s;
 | 
						|
      z-index: -1;
 | 
						|
      &:hover {
 | 
						|
        left: 28px;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  .scrollbar-wrapper {
 | 
						|
    height: 100%;
 | 
						|
    :deep(.el-scrollbar__view) {
 | 
						|
      height: 100%;
 | 
						|
    }
 | 
						|
    :deep(.el-scrollbar__wrap) {
 | 
						|
      overflow-x: hidden;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  .operate {
 | 
						|
    position: absolute;
 | 
						|
    left: 155px;
 | 
						|
    top: 50%;
 | 
						|
    font-size: 18px;
 | 
						|
    cursor: pointer;
 | 
						|
    transform: rotate(-90deg);
 | 
						|
    transition: left 0.1s;
 | 
						|
    &:hover {
 | 
						|
      left: 150px;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
</style>
 |