aside.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <template>
  2. <el-aside class="layout-aside" :class="setCollapseWidth" v-if="clientWidth > 1000">
  3. <Logo v-if="setShowLogo && menuList.length && getThemeConfig.layout !== 'columns'" />
  4. <div v-if="menuList.length && !getThemeConfig.isCollapse && getThemeConfig.layout == 'columns'" class="cat-name">
  5. {{ adminTitle || catName }}
  6. </div>
  7. <el-scrollbar class="flex-auto" ref="layoutAsideRef">
  8. <Vertical :menuList="menuList" :class="setCollapseWidth" />
  9. </el-scrollbar>
  10. </el-aside>
  11. <el-drawer :visible.sync="getThemeConfig.isCollapse" :with-header="false" direction="ltr" size="180px" v-else>
  12. <el-aside class="layout-aside w100 h100">
  13. <Logo v-if="setShowLogo && menuList.length" />
  14. <el-scrollbar class="flex-auto" ref="layoutAsideRef">
  15. <Vertical :menuList="menuList" />
  16. </el-scrollbar>
  17. </el-aside>
  18. </el-drawer>
  19. </template>
  20. <script>
  21. import Vertical from '@/layout/navMenu/vertical.vue';
  22. import Logo from '@/layout/logo/index.vue';
  23. export default {
  24. name: 'layoutAside',
  25. components: { Vertical, Logo },
  26. data() {
  27. return {
  28. // menuList: [],
  29. clientWidth: '',
  30. catName: '',
  31. };
  32. },
  33. computed: {
  34. adminTitle() {
  35. return this.$store.state.app.adminTitle || '';
  36. },
  37. // 设置左侧菜单的具体宽度
  38. menuList() {
  39. this.$store.state.menus.childMenuList.length > 0
  40. ? (this.$store.state.themeConfig.themeConfig.isCollapse = false)
  41. : (this.$store.state.themeConfig.themeConfig.isCollapse = true);
  42. return this.$store.state.menus.childMenuList;
  43. },
  44. setCollapseWidth() {
  45. let { layout, isCollapse } = this.$store.state.themeConfig.themeConfig;
  46. let asideBrColor = '';
  47. layout === 'classic' || layout === 'columns' ? (asideBrColor = 'layout-el-aside-br-color') : '';
  48. if (layout === 'columns') {
  49. // 分栏布局,菜单收起时宽度给 1px
  50. if (isCollapse) {
  51. return ['layout-aside-width1', asideBrColor];
  52. } else {
  53. return ['layout-aside-width-default', asideBrColor];
  54. }
  55. } else {
  56. // 其它布局给 64px
  57. if (isCollapse) {
  58. return ['layout-aside-width64', asideBrColor];
  59. } else {
  60. return ['layout-aside-width-default', asideBrColor];
  61. }
  62. }
  63. },
  64. // 设置 logo 是否显示
  65. setShowLogo() {
  66. let { layout, isShowLogo } = this.$store.state.themeConfig.themeConfig;
  67. return (isShowLogo && layout === 'defaults') || (isShowLogo && layout === 'columns');
  68. },
  69. // 获取布局配置信息
  70. getThemeConfig() {
  71. return this.$store.state.themeConfig.themeConfig;
  72. },
  73. },
  74. created() {
  75. this.initMenuFixed(document.body.clientWidth);
  76. this.setFilterRoutes();
  77. // this.bus.$on('setSendColumnsChildren', (res) => {
  78. // this.menuList = res || [];
  79. // this.menuList.length > 0
  80. // ? (this.$store.state.themeConfig.themeConfig.isCollapse = false)
  81. // : (this.$store.state.themeConfig.themeConfig.isCollapse = true);
  82. // });
  83. this.bus.$on('layoutMobileResize', (res) => {
  84. this.initMenuFixed(res.clientWidth);
  85. });
  86. this.bus.$on('oneCatName', (name) => {
  87. this.catName = name;
  88. });
  89. // 菜单滚动条监听
  90. this.bus.$on('updateElScrollBar', () => {
  91. setTimeout(() => {
  92. this.$refs.layoutAsideRef.update();
  93. }, 300);
  94. });
  95. if (this.$store.state.themeConfig.themeConfig.layout !== 'columns') {
  96. this.bus.$on('routesListChange', () => {
  97. this.setFilterRoutes();
  98. });
  99. }
  100. },
  101. beforeDestroy() {
  102. this.bus.$off('routesListChange');
  103. },
  104. methods: {
  105. // 设置/过滤路由(非静态路由/是否显示在菜单中)
  106. setFilterRoutes() {
  107. if (this.$store.state.themeConfig.themeConfig.layout === 'columns') return false;
  108. this.$store.commit('menus/childMenuList', this.filterRoutesFun(this.$store.state.routesList.routesList));
  109. // this.menuList = this.filterRoutesFun(this.$store.state.routesList.routesList);
  110. },
  111. // 设置/过滤路由 递归函数
  112. filterRoutesFun(arr) {
  113. return arr
  114. .filter((item) => item.path)
  115. .map((item) => {
  116. item = Object.assign({}, item);
  117. if (item.children) item.children = this.filterRoutesFun(item.children);
  118. return item;
  119. });
  120. },
  121. // 设置菜单导航是否固定(移动端)
  122. initMenuFixed(clientWidth) {
  123. this.clientWidth = clientWidth;
  124. this.$emit('routesListChange');
  125. },
  126. },
  127. // 页面销毁时
  128. destroyed() {
  129. // 取消菜单滚动条监听
  130. this.bus.$off('updateElScrollBar', () => {});
  131. },
  132. };
  133. </script>
  134. <style lang="scss" scoped>
  135. .cat-name {
  136. display: flex;
  137. align-items: center;
  138. justify-content: center;
  139. height: 50px;
  140. border-bottom: 1px solid var(--prev-border-color-lighter);
  141. font-weight: 500;
  142. font-size: 15px;
  143. }
  144. </style>