aside.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <template>
  2. <el-aside class="layout-aside" :class="setCollapseWidth" v-if="clientWidth > 1000">
  3. <Logo v-if="setShowLogo && menuList.length" />
  4. <el-scrollbar class="flex-auto" ref="layoutAsideRef">
  5. <Vertical :menuList="menuList" :class="setCollapseWidth" />
  6. </el-scrollbar>
  7. </el-aside>
  8. <el-drawer :visible.sync="getThemeConfig.isCollapse" :with-header="false" direction="ltr" size="180px" v-else>
  9. <el-aside class="layout-aside w100 h100">
  10. <Logo v-if="setShowLogo && menuList.length" />
  11. <el-scrollbar class="flex-auto" ref="layoutAsideRef">
  12. <Vertical :menuList="menuList" />
  13. </el-scrollbar>
  14. </el-aside>
  15. </el-drawer>
  16. </template>
  17. <script>
  18. import Vertical from '@/layout/navMenu/vertical.vue';
  19. import Logo from '@/layout/logo/index.vue';
  20. export default {
  21. name: 'layoutAside',
  22. components: { Vertical, Logo },
  23. data() {
  24. return {
  25. menuList: [],
  26. clientWidth: '',
  27. };
  28. },
  29. computed: {
  30. // 设置左侧菜单的具体宽度
  31. setCollapseWidth() {
  32. let { layout, isCollapse } = this.$store.state.themeConfig.themeConfig;
  33. let asideBrColor = '';
  34. layout === 'classic' || layout === 'columns' ? (asideBrColor = 'layout-el-aside-br-color') : '';
  35. if (layout === 'columns') {
  36. // 分栏布局,菜单收起时宽度给 1px
  37. if (isCollapse) {
  38. return ['layout-aside-width1', asideBrColor];
  39. } else {
  40. return ['layout-aside-width-default', asideBrColor];
  41. }
  42. } else {
  43. // 其它布局给 64px
  44. if (isCollapse) {
  45. return ['layout-aside-width64', asideBrColor];
  46. } else {
  47. return ['layout-aside-width-default', asideBrColor];
  48. }
  49. }
  50. },
  51. // 设置 logo 是否显示
  52. setShowLogo() {
  53. let { layout, isShowLogo } = this.$store.state.themeConfig.themeConfig;
  54. return (isShowLogo && layout === 'defaults') || (isShowLogo && layout === 'columns');
  55. },
  56. // 获取布局配置信息
  57. getThemeConfig() {
  58. return this.$store.state.themeConfig.themeConfig;
  59. },
  60. },
  61. created() {
  62. this.initMenuFixed(document.body.clientWidth);
  63. this.setFilterRoutes();
  64. this.bus.$on('setSendColumnsChildren', (res) => {
  65. console.log('收到了', res);
  66. this.menuList = res || [];
  67. });
  68. this.bus.$on('layoutMobileResize', (res) => {
  69. this.initMenuFixed(res.clientWidth);
  70. });
  71. // 菜单滚动条监听
  72. this.bus.$on('updateElScrollBar', () => {
  73. setTimeout(() => {
  74. this.$refs.layoutAsideRef.update();
  75. }, 300);
  76. });
  77. },
  78. methods: {
  79. // 设置/过滤路由(非静态路由/是否显示在菜单中)
  80. setFilterRoutes() {
  81. if (this.$store.state.themeConfig.themeConfig.layout === 'columns') return false;
  82. this.menuList = this.filterRoutesFun(this.$store.state.routesList.routesList);
  83. },
  84. // 设置/过滤路由 递归函数
  85. filterRoutesFun(arr) {
  86. return arr
  87. .filter((item) => item.path)
  88. .map((item) => {
  89. item = Object.assign({}, item);
  90. if (item.children) item.children = this.filterRoutesFun(item.children);
  91. return item;
  92. });
  93. },
  94. // 设置菜单导航是否固定(移动端)
  95. initMenuFixed(clientWidth) {
  96. this.clientWidth = clientWidth;
  97. },
  98. },
  99. // 页面销毁时
  100. destroyed() {
  101. // 取消菜单滚动条监听
  102. this.bus.$off('updateElScrollBar', () => {});
  103. },
  104. };
  105. </script>