Commit de25557f86945a96b89294043796ccf4ab476ad5

Authored by vben
1 parent 689425e4

fix(menu): fix scrillbar not work

CHANGELOG.zh_CN.md
  1 +## Wip
  2 +
  3 +### 🐛 Bug Fixes
  4 +
  5 +- 修复混合模式下滚动条丢失问题
  6 +
1 ## 2.0.0-rc.14 (2020-12-15) 7 ## 2.0.0-rc.14 (2020-12-15)
2 8
3 ### ✨ Features 9 ### ✨ Features
src/components/Menu/src/BasicMenu.vue
@@ -90,9 +90,10 @@ @@ -90,9 +90,10 @@
90 }); 90 });
91 91
92 const getMenuClass = computed(() => { 92 const getMenuClass = computed(() => {
  93 + const align = props.isHorizontal && unref(getSplit) ? 'start' : unref(getTopMenuAlign);
93 return [ 94 return [
94 prefixCls, 95 prefixCls,
95 - `justify-${unref(getTopMenuAlign)}`, 96 + `justify-${align}`,
96 { 97 {
97 [`${prefixCls}--hide-title`]: !unref(showTitle), 98 [`${prefixCls}--hide-title`]: !unref(showTitle),
98 [`${prefixCls}--collapsed-show-title`]: props.collapsedShowTitle, 99 [`${prefixCls}--collapsed-show-title`]: props.collapsedShowTitle,
src/layouts/default/header/index.vue
@@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
7 v-if="getShowHeaderLogo || getIsMobile" 7 v-if="getShowHeaderLogo || getIsMobile"
8 :class="`${prefixCls}-logo`" 8 :class="`${prefixCls}-logo`"
9 :theme="getHeaderTheme" 9 :theme="getHeaderTheme"
  10 + :style="getLogoWidth"
10 /> 11 />
11 <LayoutTrigger 12 <LayoutTrigger
12 v-if="(getShowContent && getShowHeaderTrigger && !getSplit) || getIsMobile" 13 v-if="(getShowContent && getShowHeaderTrigger && !getSplit) || getIsMobile"
@@ -103,7 +104,13 @@ @@ -103,7 +104,13 @@
103 }, 104 },
104 setup(props) { 105 setup(props) {
105 const { prefixCls } = useDesign('layout-header'); 106 const { prefixCls } = useDesign('layout-header');
106 - const { getShowTopMenu, getShowHeaderTrigger, getSplit } = useMenuSetting(); 107 + const {
  108 + getShowTopMenu,
  109 + getShowHeaderTrigger,
  110 + getSplit,
  111 + getIsMixMode,
  112 + getMenuWidth,
  113 + } = useMenuSetting();
107 const { getShowLocale } = useLocaleSetting(); 114 const { getShowLocale } = useLocaleSetting();
108 const { getUseErrorHandle } = useRootSetting(); 115 const { getUseErrorHandle } = useRootSetting();
109 116
@@ -131,6 +138,14 @@ @@ -131,6 +138,14 @@
131 ]; 138 ];
132 }); 139 });
133 140
  141 + const getLogoWidth = computed(() => {
  142 + if (!unref(getIsMixMode)) {
  143 + return {};
  144 + }
  145 + const width = unref(getMenuWidth) < 180 ? 180 : unref(getMenuWidth);
  146 + return { width: `${width}px` };
  147 + });
  148 +
134 const getSplitType = computed(() => { 149 const getSplitType = computed(() => {
135 return unref(getSplit) ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE; 150 return unref(getSplit) ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE;
136 }); 151 });
@@ -157,6 +172,7 @@ @@ -157,6 +172,7 @@
157 getShowNotice, 172 getShowNotice,
158 getUseLockPage, 173 getUseLockPage,
159 getUseErrorHandle, 174 getUseErrorHandle,
  175 + getLogoWidth,
160 }; 176 };
161 }, 177 },
162 }); 178 });
src/layouts/default/menu/index.tsx
@@ -47,6 +47,7 @@ export default defineComponent({ @@ -47,6 +47,7 @@ export default defineComponent({
47 getMenuTheme, 47 getMenuTheme,
48 getCollapsed, 48 getCollapsed,
49 getAccordion, 49 getAccordion,
  50 + getIsHorizontal,
50 getIsSidebarType, 51 getIsSidebarType,
51 } = useMenuSetting(); 52 } = useMenuSetting();
52 const { getShowLogo } = useRootSetting(); 53 const { getShowLogo } = useRootSetting();
@@ -66,7 +67,12 @@ export default defineComponent({ @@ -66,7 +67,12 @@ export default defineComponent({
66 const getIsShowLogo = computed(() => unref(getShowLogo) && unref(getIsSidebarType)); 67 const getIsShowLogo = computed(() => unref(getShowLogo) && unref(getIsSidebarType));
67 68
68 const getUseScroll = computed(() => { 69 const getUseScroll = computed(() => {
69 - return unref(getIsSidebarType) || props.splitType === MenuSplitTyeEnum.LEFT; 70 + return (
  71 + !unref(getIsHorizontal) &&
  72 + (unref(getIsSidebarType) ||
  73 + props.splitType === MenuSplitTyeEnum.LEFT ||
  74 + props.splitType === MenuSplitTyeEnum.NONE)
  75 + );
70 }); 76 });
71 77
72 const getWrapperStyle = computed( 78 const getWrapperStyle = computed(
src/layouts/default/setting/SettingDrawer.tsx
@@ -10,7 +10,7 @@ import { @@ -10,7 +10,7 @@ import {
10 InputNumberItem, 10 InputNumberItem,
11 } from './components'; 11 } from './components';
12 12
13 -import { MenuTypeEnum } from '/@/enums/menuEnum'; 13 +import { MenuTypeEnum, TriggerEnum } from '/@/enums/menuEnum';
14 14
15 import { useRootSetting } from '/@/hooks/setting/useRootSetting'; 15 import { useRootSetting } from '/@/hooks/setting/useRootSetting';
16 import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; 16 import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
@@ -25,7 +25,7 @@ import { @@ -25,7 +25,7 @@ import {
25 HandlerEnum, 25 HandlerEnum,
26 contentModeOptions, 26 contentModeOptions,
27 topMenuAlignOptions, 27 topMenuAlignOptions,
28 - menuTriggerOptions, 28 + getMenuTriggerOptions,
29 routerTransitionOptions, 29 routerTransitionOptions,
30 menuTypeList, 30 menuTypeList,
31 } from './enum'; 31 } from './enum';
@@ -134,6 +134,14 @@ export default defineComponent({ @@ -134,6 +134,14 @@ export default defineComponent({
134 * @description: 134 * @description:
135 */ 135 */
136 function renderFeatures() { 136 function renderFeatures() {
  137 + let triggerDef = unref(getTrigger);
  138 +
  139 + const triggerOptions = getMenuTriggerOptions(unref(getSplit));
  140 + const some = triggerOptions.some((item) => item.value === triggerDef);
  141 + if (!some) {
  142 + triggerDef = TriggerEnum.FOOTER;
  143 + }
  144 +
137 return ( 145 return (
138 <> 146 <>
139 <SwitchItem 147 <SwitchItem
@@ -183,13 +191,15 @@ export default defineComponent({ @@ -183,13 +191,15 @@ export default defineComponent({
183 event={HandlerEnum.MENU_TOP_ALIGN} 191 event={HandlerEnum.MENU_TOP_ALIGN}
184 def={unref(getTopMenuAlign)} 192 def={unref(getTopMenuAlign)}
185 options={topMenuAlignOptions} 193 options={topMenuAlignOptions}
186 - disabled={!unref(getShowHeader) || (!unref(getIsTopMenu) && !unref(getSplit))} 194 + disabled={
  195 + !unref(getShowHeader) || unref(getSplit) || (!unref(getIsTopMenu) && !unref(getSplit))
  196 + }
187 /> 197 />
188 <SelectItem 198 <SelectItem
189 title={t('layout.setting.menuCollapseButton')} 199 title={t('layout.setting.menuCollapseButton')}
190 event={HandlerEnum.MENU_TRIGGER} 200 event={HandlerEnum.MENU_TRIGGER}
191 - def={unref(getTrigger)}  
192 - options={menuTriggerOptions} 201 + def={triggerDef}
  202 + options={triggerOptions}
193 disabled={!unref(getShowMenuRef)} 203 disabled={!unref(getShowMenuRef)}
194 /> 204 />
195 <SelectItem 205 <SelectItem
src/layouts/default/setting/enum.ts
@@ -76,20 +76,26 @@ export const topMenuAlignOptions = [ @@ -76,20 +76,26 @@ export const topMenuAlignOptions = [
76 }, 76 },
77 ]; 77 ];
78 78
79 -export const menuTriggerOptions = [  
80 - {  
81 - value: TriggerEnum.NONE,  
82 - label: t('layout.setting.menuTriggerNone'),  
83 - },  
84 - {  
85 - value: TriggerEnum.FOOTER,  
86 - label: t('layout.setting.menuTriggerBottom'),  
87 - },  
88 - {  
89 - value: TriggerEnum.HEADER,  
90 - label: t('layout.setting.menuTriggerTop'),  
91 - },  
92 -]; 79 +export const getMenuTriggerOptions = (hideTop: boolean) => {
  80 + return [
  81 + {
  82 + value: TriggerEnum.NONE,
  83 + label: t('layout.setting.menuTriggerNone'),
  84 + },
  85 + {
  86 + value: TriggerEnum.FOOTER,
  87 + label: t('layout.setting.menuTriggerBottom'),
  88 + },
  89 + ...(hideTop
  90 + ? []
  91 + : [
  92 + {
  93 + value: TriggerEnum.HEADER,
  94 + label: t('layout.setting.menuTriggerTop'),
  95 + },
  96 + ]),
  97 + ];
  98 +};
93 99
94 export const routerTransitionOptions = [ 100 export const routerTransitionOptions = [
95 RouterTransitionEnum.ZOOM_FADE, 101 RouterTransitionEnum.ZOOM_FADE,
src/layouts/default/setting/handler.ts
@@ -25,6 +25,7 @@ export function handler(event: HandlerEnum, value: any): DeepPartial&lt;ProjectConf @@ -25,6 +25,7 @@ export function handler(event: HandlerEnum, value: any): DeepPartial&lt;ProjectConf
25 type, 25 type,
26 collapsed: false, 26 collapsed: false,
27 show: true, 27 show: true,
  28 + hidden: false,
28 ...splitOpt, 29 ...splitOpt,
29 }, 30 },
30 }; 31 };
src/layouts/default/sider/LayoutSider.tsx renamed to src/layouts/default/sider/LayoutSider.vue
1 -import './index.less';  
2 -  
3 -import { computed, defineComponent, ref, unref, CSSProperties } from 'vue';  
4 -  
5 -import { Layout } from 'ant-design-vue';  
6 -import LayoutMenu from '../menu';  
7 -  
8 -import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';  
9 -  
10 -import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';  
11 -import { useTrigger, useDragLine, useSiderEvent } from './useLayoutSider';  
12 -import { useAppInject } from '/@/hooks/web/useAppInject';  
13 -import { useDesign } from '/@/hooks/web/useDesign';  
14 -  
15 -import DragBar from './DragBar.vue';  
16 -export default defineComponent({  
17 - name: 'LayoutSideBar',  
18 - setup() {  
19 - const dragBarRef = ref<ElRef>(null);  
20 - const sideRef = ref<ElRef>(null);  
21 -  
22 - const {  
23 - getCollapsed,  
24 - getMenuWidth,  
25 - getSplit,  
26 - getMenuTheme,  
27 - getRealWidth,  
28 - getMenuHidden,  
29 - getMenuFixed,  
30 - getIsMixMode,  
31 - } = useMenuSetting();  
32 -  
33 - const { prefixCls } = useDesign('layout-sideBar');  
34 -  
35 - const { getIsMobile } = useAppInject();  
36 -  
37 - const { getTriggerAttr, getTriggerSlot } = useTrigger(getIsMobile);  
38 -  
39 - useDragLine(sideRef, dragBarRef);  
40 -  
41 - const { getCollapsedWidth, onBreakpointChange, onCollapseChange } = useSiderEvent();  
42 -  
43 - const getMode = computed(() => {  
44 - return unref(getSplit) ? MenuModeEnum.INLINE : null;  
45 - });  
46 -  
47 - const getSplitType = computed(() => {  
48 - return unref(getSplit) ? MenuSplitTyeEnum.LEFT : MenuSplitTyeEnum.NONE;  
49 - });  
50 -  
51 - const showClassSideBarRef = computed(() => {  
52 - return unref(getSplit) ? !unref(getMenuHidden) : true;  
53 - }); 1 +<template>
  2 + <div
  3 + v-if="getMenuFixed && !getIsMobile"
  4 + :style="getHiddenDomStyle"
  5 + :class="{ hidden: !showClassSideBarRef }"
  6 + />
  7 + <Sider
  8 + ref="sideRef"
  9 + breakpoint="lg"
  10 + collapsible
  11 + :class="getSiderClass"
  12 + :width="getMenuWidth"
  13 + :collapsed="getIsMobile ? false : getCollapsed"
  14 + :collapsedWidth="getCollapsedWidth"
  15 + :theme="getMenuTheme"
  16 + @collapse="onCollapseChange"
  17 + @breakpoint="onBreakpointChange"
  18 + v-bind="getTriggerAttr"
  19 + >
  20 + <template #trigger v-if="getShowTrigger">
  21 + <LayoutTrigger />
  22 + </template>
  23 + <LayoutMenu :theme="getMenuTheme" :menuMode="getMode" :splitType="getSplitType" />
  24 + <DragBar ref="dragBarRef" />
  25 + </Sider>
  26 +</template>
  27 +<script lang="ts">
  28 + import { computed, defineComponent, ref, unref, CSSProperties } from 'vue';
  29 +
  30 + import { Layout } from 'ant-design-vue';
  31 + import LayoutMenu from '../menu';
  32 + import LayoutTrigger from '/@/layouts/default/trigger/index.vue';
  33 +
  34 + import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
  35 +
  36 + import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
  37 + import { useTrigger, useDragLine, useSiderEvent } from './useLayoutSider';
  38 + import { useAppInject } from '/@/hooks/web/useAppInject';
  39 + import { useDesign } from '/@/hooks/web/useDesign';
  40 +
  41 + import DragBar from './DragBar.vue';
  42 + export default defineComponent({
  43 + name: 'LayoutSideBar',
  44 + components: { Sider: Layout.Sider, LayoutMenu, DragBar, LayoutTrigger },
  45 + setup() {
  46 + const dragBarRef = ref<ElRef>(null);
  47 + const sideRef = ref<ElRef>(null);
  48 +
  49 + const {
  50 + getCollapsed,
  51 + getMenuWidth,
  52 + getSplit,
  53 + getMenuTheme,
  54 + getRealWidth,
  55 + getMenuHidden,
  56 + getMenuFixed,
  57 + getIsMixMode,
  58 + } = useMenuSetting();
  59 +
  60 + const { prefixCls } = useDesign('layout-sideBar');
  61 +
  62 + const { getIsMobile } = useAppInject();
  63 +
  64 + const { getTriggerAttr, getShowTrigger } = useTrigger(getIsMobile);
  65 +
  66 + useDragLine(sideRef, dragBarRef);
  67 +
  68 + const { getCollapsedWidth, onBreakpointChange, onCollapseChange } = useSiderEvent();
  69 +
  70 + const getMode = computed(() => {
  71 + return unref(getSplit) ? MenuModeEnum.INLINE : null;
  72 + });
  73 +
  74 + const getSplitType = computed(() => {
  75 + return unref(getSplit) ? MenuSplitTyeEnum.LEFT : MenuSplitTyeEnum.NONE;
  76 + });
  77 +
  78 + const showClassSideBarRef = computed(() => {
  79 + return unref(getSplit) ? !unref(getMenuHidden) : true;
  80 + });
  81 +
  82 + const getSiderClass = computed(() => {
  83 + return [
  84 + prefixCls,
  85 + {
  86 + [`${prefixCls}--fixed`]: unref(getMenuFixed),
  87 + hidden: !unref(showClassSideBarRef),
  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 + );
54 106
55 - const getSiderClass = computed(() => {  
56 - return [ 107 + return {
57 prefixCls, 108 prefixCls,
58 - {  
59 - [`${prefixCls}--fixed`]: unref(getMenuFixed),  
60 - hidden: !unref(showClassSideBarRef),  
61 - [`${prefixCls}--mix`]: unref(getIsMixMode) && !unref(getIsMobile),  
62 - },  
63 - ];  
64 - });  
65 -  
66 - const getHiddenDomStyle = computed(  
67 - (): CSSProperties => {  
68 - const width = `${unref(getRealWidth)}px`;  
69 - return {  
70 - width: width,  
71 - overflow: 'hidden',  
72 - flex: `0 0 ${width}`,  
73 - maxWidth: width,  
74 - minWidth: width,  
75 - transition: 'all 0.2s',  
76 - };  
77 - }  
78 - );  
79 -  
80 - function renderDefault() {  
81 - return (  
82 - <>  
83 - <LayoutMenu  
84 - theme={unref(getMenuTheme)}  
85 - menuMode={unref(getMode)}  
86 - splitType={unref(getSplitType)}  
87 - />  
88 - <DragBar ref={dragBarRef} />  
89 - </>  
90 - );  
91 - }  
92 -  
93 - return () => {  
94 - return (  
95 - <>  
96 - {unref(getMenuFixed) && !unref(getIsMobile) && (  
97 - <div style={unref(getHiddenDomStyle)} class={{ hidden: !unref(showClassSideBarRef) }} />  
98 - )}  
99 - <Layout.Sider  
100 - ref={sideRef}  
101 - breakpoint="lg"  
102 - collapsible  
103 - class={unref(getSiderClass)}  
104 - width={unref(getMenuWidth)}  
105 - collapsed={unref(getIsMobile) ? false : unref(getCollapsed)}  
106 - collapsedWidth={unref(getCollapsedWidth)}  
107 - theme={unref(getMenuTheme)}  
108 - onCollapse={onCollapseChange}  
109 - onBreakpoint={onBreakpointChange}  
110 - {...unref(getTriggerAttr)}  
111 - >  
112 - {{  
113 - ...unref(getTriggerSlot),  
114 - default: () => renderDefault(),  
115 - }}  
116 - </Layout.Sider>  
117 - </>  
118 - );  
119 - };  
120 - },  
121 -}); 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">
  131 + @import './index.less';
  132 +</style>
src/layouts/default/sider/index.vue
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 <script lang="ts"> 15 <script lang="ts">
16 import { defineComponent } from 'vue'; 16 import { defineComponent } from 'vue';
17 17
18 - import Sider from './LayoutSider'; 18 + import Sider from './LayoutSider.vue';
19 import { Drawer } from 'ant-design-vue'; 19 import { Drawer } from 'ant-design-vue';
20 import { useAppInject } from '/@/hooks/web/useAppInject'; 20 import { useAppInject } from '/@/hooks/web/useAppInject';
21 import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; 21 import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
src/layouts/default/sider/useLayoutSider.tsx renamed to src/layouts/default/sider/useLayoutSider.ts
1 import type { Ref } from 'vue'; 1 import type { Ref } from 'vue';
2 2
3 import { computed, unref, onMounted, nextTick, ref } from 'vue'; 3 import { computed, unref, onMounted, nextTick, ref } from 'vue';
4 -import LayoutTrigger from '/@/layouts/default/trigger/index.vue';  
5 4
6 import { TriggerEnum } from '/@/enums/menuEnum'; 5 import { TriggerEnum } from '/@/enums/menuEnum';
7 6
@@ -45,7 +44,7 @@ export function useSiderEvent() { @@ -45,7 +44,7 @@ export function useSiderEvent() {
45 export function useTrigger(getIsMobile: Ref<boolean>) { 44 export function useTrigger(getIsMobile: Ref<boolean>) {
46 const { getTrigger, getSplit } = useMenuSetting(); 45 const { getTrigger, getSplit } = useMenuSetting();
47 46
48 - const showTrigger = computed(() => { 47 + const getShowTrigger = computed(() => {
49 const trigger = unref(getTrigger); 48 const trigger = unref(getTrigger);
50 49
51 return ( 50 return (
@@ -56,7 +55,7 @@ export function useTrigger(getIsMobile: Ref&lt;boolean&gt;) { @@ -56,7 +55,7 @@ export function useTrigger(getIsMobile: Ref&lt;boolean&gt;) {
56 }); 55 });
57 56
58 const getTriggerAttr = computed(() => { 57 const getTriggerAttr = computed(() => {
59 - if (unref(showTrigger)) { 58 + if (unref(getShowTrigger)) {
60 return {}; 59 return {};
61 } 60 }
62 return { 61 return {
@@ -64,16 +63,7 @@ export function useTrigger(getIsMobile: Ref&lt;boolean&gt;) { @@ -64,16 +63,7 @@ export function useTrigger(getIsMobile: Ref&lt;boolean&gt;) {
64 }; 63 };
65 }); 64 });
66 65
67 - const getTriggerSlot = computed(() => {  
68 - if (unref(showTrigger)) {  
69 - return {  
70 - trigger: () => <LayoutTrigger />,  
71 - };  
72 - }  
73 - return {};  
74 - });  
75 -  
76 - return { getTriggerAttr, getTriggerSlot }; 66 + return { getTriggerAttr, getShowTrigger };
77 } 67 }
78 68
79 /** 69 /**