vben
2021-02-05 aaae66835a9f1bdfa316e187c01557e5b54959ab
提交 | 用户 | age
de2555 1 <template>
V 2   <div
3     v-if="getMenuFixed && !getIsMobile"
4     :style="getHiddenDomStyle"
aaae66 5     v-show="showClassSideBarRef"
9edc28 6   ></div>
de2555 7   <Sider
aaae66 8     v-show="showClassSideBarRef"
de2555 9     ref="sideRef"
V 10     breakpoint="lg"
11     collapsible
12     :class="getSiderClass"
13     :width="getMenuWidth"
14     :collapsed="getIsMobile ? false : getCollapsed"
15     :collapsedWidth="getCollapsedWidth"
16     :theme="getMenuTheme"
17     @collapse="onCollapseChange"
18     @breakpoint="onBreakpointChange"
19     v-bind="getTriggerAttr"
20   >
21     <template #trigger v-if="getShowTrigger">
22       <LayoutTrigger />
23     </template>
24     <LayoutMenu :theme="getMenuTheme" :menuMode="getMode" :splitType="getSplitType" />
25     <DragBar ref="dragBarRef" />
26   </Sider>
27 </template>
28 <script lang="ts">
29   import { computed, defineComponent, ref, unref, CSSProperties } from 'vue';
30
31   import { Layout } from 'ant-design-vue';
32   import LayoutMenu from '../menu';
33   import LayoutTrigger from '/@/layouts/default/trigger/index.vue';
34
35   import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
36
37   import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
38   import { useTrigger, useDragLine, useSiderEvent } from './useLayoutSider';
39   import { useAppInject } from '/@/hooks/web/useAppInject';
40   import { useDesign } from '/@/hooks/web/useDesign';
41
42   import DragBar from './DragBar.vue';
43   export default defineComponent({
44     name: 'LayoutSideBar',
45     components: { Sider: Layout.Sider, LayoutMenu, DragBar, LayoutTrigger },
46     setup() {
47       const dragBarRef = ref<ElRef>(null);
48       const sideRef = ref<ElRef>(null);
49
50       const {
51         getCollapsed,
52         getMenuWidth,
53         getSplit,
54         getMenuTheme,
55         getRealWidth,
56         getMenuHidden,
57         getMenuFixed,
58         getIsMixMode,
59       } = useMenuSetting();
60
61       const { prefixCls } = useDesign('layout-sideBar');
62
63       const { getIsMobile } = useAppInject();
64
65       const { getTriggerAttr, getShowTrigger } = useTrigger(getIsMobile);
66
67       useDragLine(sideRef, dragBarRef);
68
69       const { getCollapsedWidth, onBreakpointChange, onCollapseChange } = useSiderEvent();
70
71       const getMode = computed(() => {
72         return unref(getSplit) ? MenuModeEnum.INLINE : null;
73       });
74
75       const getSplitType = computed(() => {
76         return unref(getSplit) ? MenuSplitTyeEnum.LEFT : MenuSplitTyeEnum.NONE;
77       });
78
79       const showClassSideBarRef = computed(() => {
80         return unref(getSplit) ? !unref(getMenuHidden) : true;
81       });
82
83       const getSiderClass = computed(() => {
84         return [
85           prefixCls,
86           {
87             [`${prefixCls}--fixed`]: unref(getMenuFixed),
88             [`${prefixCls}--mix`]: unref(getIsMixMode) && !unref(getIsMobile),
89           },
90         ];
91       });
92
93       const getHiddenDomStyle = computed(
94         (): CSSProperties => {
95           const width = `${unref(getRealWidth)}px`;
96           return {
97             width: width,
98             overflow: 'hidden',
99             flex: `0 0 ${width}`,
100             maxWidth: width,
101             minWidth: width,
102             transition: 'all 0.2s',
103           };
104         }
105       );
106
107       return {
108         prefixCls,
109         sideRef,
110         dragBarRef,
111         getIsMobile,
112         getHiddenDomStyle,
113         getSiderClass,
114         getTriggerAttr,
115         getCollapsedWidth,
116         getMenuFixed,
117         showClassSideBarRef,
118         getMenuWidth,
119         getCollapsed,
120         getMenuTheme,
121         onBreakpointChange,
122         getMode,
123         getSplitType,
124         onCollapseChange,
125         getShowTrigger,
126       };
127     },
128   });
129 </script>
130 <style lang="less">
e6db0d 131   @prefix-cls: ~'@{namespace}-layout-sideBar';
V 132
133   .@{prefix-cls} {
134     z-index: @layout-sider-fixed-z-index;
135
136     &--fixed {
137       position: fixed;
138       top: 0;
139       left: 0;
140       height: 100%;
141     }
142
143     &--mix {
144       top: @header-height;
145       height: calc(100% - @header-height);
146     }
147
148     &.ant-layout-sider-dark {
149       background: @sider-dark-bg-color;
150
151       .ant-layout-sider-trigger {
152         color: darken(@white, 25%);
153         background: @trigger-dark-bg-color;
154
155         &:hover {
156           color: @white;
157           background: @trigger-dark-hover-bg-color;
158         }
159       }
160     }
161
162     &:not(.ant-layout-sider-dark) {
163       // box-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05);
164
165       .ant-layout-sider-trigger {
166         color: @text-color-base;
167         border-top: 1px solid @border-color-light;
168       }
169     }
170
171     .ant-layout-sider-zero-width-trigger {
172       top: 40%;
173       z-index: 10;
174     }
175
176     & .ant-layout-sider-trigger {
177       height: 36px;
178       line-height: 36px;
179     }
180   }
de2555 181 </style>