Commit de25557f86945a96b89294043796ccf4ab476ad5
1 parent
689425e4
fix(menu): fix scrillbar not work
Showing
10 changed files
with
202 additions
and
155 deletions
CHANGELOG.zh_CN.md
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
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<boolean>) { |
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<boolean>) { |
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 | /** | ... | ... |