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 7 ## 2.0.0-rc.14 (2020-12-15)
2 8  
3 9 ### ✨ Features
... ...
src/components/Menu/src/BasicMenu.vue
... ... @@ -90,9 +90,10 @@
90 90 });
91 91  
92 92 const getMenuClass = computed(() => {
  93 + const align = props.isHorizontal && unref(getSplit) ? 'start' : unref(getTopMenuAlign);
93 94 return [
94 95 prefixCls,
95   - `justify-${unref(getTopMenuAlign)}`,
  96 + `justify-${align}`,
96 97 {
97 98 [`${prefixCls}--hide-title`]: !unref(showTitle),
98 99 [`${prefixCls}--collapsed-show-title`]: props.collapsedShowTitle,
... ...
src/layouts/default/header/index.vue
... ... @@ -7,6 +7,7 @@
7 7 v-if="getShowHeaderLogo || getIsMobile"
8 8 :class="`${prefixCls}-logo`"
9 9 :theme="getHeaderTheme"
  10 + :style="getLogoWidth"
10 11 />
11 12 <LayoutTrigger
12 13 v-if="(getShowContent && getShowHeaderTrigger && !getSplit) || getIsMobile"
... ... @@ -103,7 +104,13 @@
103 104 },
104 105 setup(props) {
105 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 114 const { getShowLocale } = useLocaleSetting();
108 115 const { getUseErrorHandle } = useRootSetting();
109 116  
... ... @@ -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 149 const getSplitType = computed(() => {
135 150 return unref(getSplit) ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE;
136 151 });
... ... @@ -157,6 +172,7 @@
157 172 getShowNotice,
158 173 getUseLockPage,
159 174 getUseErrorHandle,
  175 + getLogoWidth,
160 176 };
161 177 },
162 178 });
... ...
src/layouts/default/menu/index.tsx
... ... @@ -47,6 +47,7 @@ export default defineComponent({
47 47 getMenuTheme,
48 48 getCollapsed,
49 49 getAccordion,
  50 + getIsHorizontal,
50 51 getIsSidebarType,
51 52 } = useMenuSetting();
52 53 const { getShowLogo } = useRootSetting();
... ... @@ -66,7 +67,12 @@ export default defineComponent({
66 67 const getIsShowLogo = computed(() => unref(getShowLogo) && unref(getIsSidebarType));
67 68  
68 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 78 const getWrapperStyle = computed(
... ...
src/layouts/default/setting/SettingDrawer.tsx
... ... @@ -10,7 +10,7 @@ import {
10 10 InputNumberItem,
11 11 } from './components';
12 12  
13   -import { MenuTypeEnum } from '/@/enums/menuEnum';
  13 +import { MenuTypeEnum, TriggerEnum } from '/@/enums/menuEnum';
14 14  
15 15 import { useRootSetting } from '/@/hooks/setting/useRootSetting';
16 16 import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
... ... @@ -25,7 +25,7 @@ import {
25 25 HandlerEnum,
26 26 contentModeOptions,
27 27 topMenuAlignOptions,
28   - menuTriggerOptions,
  28 + getMenuTriggerOptions,
29 29 routerTransitionOptions,
30 30 menuTypeList,
31 31 } from './enum';
... ... @@ -134,6 +134,14 @@ export default defineComponent({
134 134 * @description:
135 135 */
136 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 145 return (
138 146 <>
139 147 <SwitchItem
... ... @@ -183,13 +191,15 @@ export default defineComponent({
183 191 event={HandlerEnum.MENU_TOP_ALIGN}
184 192 def={unref(getTopMenuAlign)}
185 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 198 <SelectItem
189 199 title={t('layout.setting.menuCollapseButton')}
190 200 event={HandlerEnum.MENU_TRIGGER}
191   - def={unref(getTrigger)}
192   - options={menuTriggerOptions}
  201 + def={triggerDef}
  202 + options={triggerOptions}
193 203 disabled={!unref(getShowMenuRef)}
194 204 />
195 205 <SelectItem
... ...
src/layouts/default/setting/enum.ts
... ... @@ -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 100 export const routerTransitionOptions = [
95 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 25 type,
26 26 collapsed: false,
27 27 show: true,
  28 + hidden: false,
28 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 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 15 <script lang="ts">
16 16 import { defineComponent } from 'vue';
17 17  
18   - import Sider from './LayoutSider';
  18 + import Sider from './LayoutSider.vue';
19 19 import { Drawer } from 'ant-design-vue';
20 20 import { useAppInject } from '/@/hooks/web/useAppInject';
21 21 import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
... ...
src/layouts/default/sider/useLayoutSider.tsx renamed to src/layouts/default/sider/useLayoutSider.ts
1 1 import type { Ref } from 'vue';
2 2  
3 3 import { computed, unref, onMounted, nextTick, ref } from 'vue';
4   -import LayoutTrigger from '/@/layouts/default/trigger/index.vue';
5 4  
6 5 import { TriggerEnum } from '/@/enums/menuEnum';
7 6  
... ... @@ -45,7 +44,7 @@ export function useSiderEvent() {
45 44 export function useTrigger(getIsMobile: Ref<boolean>) {
46 45 const { getTrigger, getSplit } = useMenuSetting();
47 46  
48   - const showTrigger = computed(() => {
  47 + const getShowTrigger = computed(() => {
49 48 const trigger = unref(getTrigger);
50 49  
51 50 return (
... ... @@ -56,7 +55,7 @@ export function useTrigger(getIsMobile: Ref&lt;boolean&gt;) {
56 55 });
57 56  
58 57 const getTriggerAttr = computed(() => {
59   - if (unref(showTrigger)) {
  58 + if (unref(getShowTrigger)) {
60 59 return {};
61 60 }
62 61 return {
... ... @@ -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 /**
... ...