index.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <template>
  2. <div
  3. :class="{ 'has-logo': showLogo }"
  4. :style="{
  5. backgroundColor:
  6. settings.sideTheme === 'theme-dark'
  7. ? variables.menuBackground
  8. : variables.menuLightBackground,
  9. }"
  10. >
  11. <logo v-if="showLogo" :collapse="isCollapse" />
  12. <el-scrollbar :class="settings.sideTheme" wrap-class="scrollbar-wrapper">
  13. <el-menu
  14. :default-openeds="openList"
  15. :default-active="activeMenu"
  16. :collapse="isCollapse"
  17. :background-color="
  18. settings.sideTheme === 'theme-dark'
  19. ? variables.menuBackground
  20. : variables.menuLightBackground
  21. "
  22. :text-color="
  23. settings.sideTheme === 'theme-dark'
  24. ? variables.menuColor
  25. : variables.menuLightColor
  26. "
  27. :unique-opened="false"
  28. :active-text-color="settings.theme"
  29. :collapse-transition="false"
  30. class="el-menu-vertical-demo"
  31. mode="vertical"
  32. >
  33. <!-- 左侧菜单bug menu-trigger="click" -->
  34. <sidebar-item
  35. v-for="(route, index) in sidebarRouters"
  36. :key="route.path + index"
  37. :item="route"
  38. :base-path="route.path"
  39. />
  40. </el-menu>
  41. </el-scrollbar>
  42. </div>
  43. </template>
  44. <script>
  45. import { mapGetters, mapState } from "vuex";
  46. import Logo from "./Logo";
  47. import SidebarItem from "./SidebarItem";
  48. import variables from "@/assets/styles/variables.scss";
  49. const WIDTH = 992;
  50. export default {
  51. components: { SidebarItem, Logo },
  52. data() {
  53. return {
  54. // isCollapse: false,
  55. };
  56. },
  57. computed: {
  58. ...mapState(["settings"]),
  59. ...mapGetters(["sidebarRouters", "sidebar"]),
  60. activeMenu() {
  61. const route = this.$route;
  62. const { meta, path } = route;
  63. // if set path, the sidebar will highlight the path you set
  64. if (meta.activeMenu) {
  65. return meta.activeMenu;
  66. }
  67. console.log(path);
  68. return path;
  69. },
  70. showLogo() {
  71. return this.$store.state.settings.sidebarLogo;
  72. },
  73. variables() {
  74. return variables;
  75. },
  76. isCollapse() {
  77. return !this.sidebar.opened;
  78. // return true
  79. // return false;
  80. },
  81. openList() {
  82. return this.sidebarRouters.map((item) => item.path);
  83. },
  84. },
  85. methods: {
  86. onLayoutResize() {
  87. // const clientWidth = document.documentElement.clientWidth;
  88. const rect = document.body.getBoundingClientRect();
  89. if (rect.width - 1 < WIDTH) {
  90. // this.$store.dispatch("app/closeSideBar", { withoutAnimation: true });
  91. this.isCollapse = true;
  92. } else {
  93. this.isCollapse = false;
  94. }
  95. console.log(this.isCollapse);
  96. },
  97. },
  98. mounted() {
  99. // window.addEventListener("resize", this.onLayoutResize);
  100. },
  101. beforeDestroy() {
  102. // window.removeEventListener("resize", this.onLayoutResize);
  103. },
  104. };
  105. </script>
  106. <style lang="scss">
  107. // :deep(.el-menu-vertical-demo:not(.el-menu--collapse)) {
  108. // width: 200px;
  109. // min-height: 400px;
  110. // }
  111. .el-menu-vertical-demo:not(.el-menu--collapse) {
  112. width: 200px;
  113. min-height: 400px;
  114. }
  115. </style>