Commit 0419a070413be34ea5455ed955fa51d8c522da86
1 parent
799a694b
feat(menu): add mixSideTrigger setting
Showing
5 changed files
with
42 additions
and
3 deletions
CHANGELOG.zh_CN.md
src/hooks/setting/useMenuSetting.ts
@@ -33,6 +33,8 @@ const getSplit = computed(() => unref(getMenuSetting).split); | @@ -33,6 +33,8 @@ const getSplit = computed(() => unref(getMenuSetting).split); | ||
33 | 33 | ||
34 | const getMenuBgColor = computed(() => unref(getMenuSetting).bgColor); | 34 | const getMenuBgColor = computed(() => unref(getMenuSetting).bgColor); |
35 | 35 | ||
36 | +const getMixSideTrigger = computed(() => unref(getMenuSetting).mixSideTrigger); | ||
37 | + | ||
36 | const getCanDrag = computed(() => unref(getMenuSetting).canDrag); | 38 | const getCanDrag = computed(() => unref(getMenuSetting).canDrag); |
37 | 39 | ||
38 | const getAccordion = computed(() => unref(getMenuSetting).accordion); | 40 | const getAccordion = computed(() => unref(getMenuSetting).accordion); |
@@ -145,5 +147,6 @@ export function useMenuSetting() { | @@ -145,5 +147,6 @@ export function useMenuSetting() { | ||
145 | getIsMixMode, | 147 | getIsMixMode, |
146 | getIsMixSidebar, | 148 | getIsMixSidebar, |
147 | getCloseMixSidebarOnChange, | 149 | getCloseMixSidebarOnChange, |
150 | + getMixSideTrigger, | ||
148 | }; | 151 | }; |
149 | } | 152 | } |
src/layouts/default/sider/MixSider.vue
@@ -10,6 +10,7 @@ | @@ -10,6 +10,7 @@ | ||
10 | open: openMenu, | 10 | open: openMenu, |
11 | }, | 11 | }, |
12 | ]" | 12 | ]" |
13 | + v-bind="getMenuEvents" | ||
13 | > | 14 | > |
14 | <AppLogo :showTitle="false" :class="`${prefixCls}-logo`" /> | 15 | <AppLogo :showTitle="false" :class="`${prefixCls}-logo`" /> |
15 | <ScrollContainer> | 16 | <ScrollContainer> |
@@ -23,7 +24,7 @@ | @@ -23,7 +24,7 @@ | ||
23 | ]" | 24 | ]" |
24 | v-for="item in menuModules" | 25 | v-for="item in menuModules" |
25 | :key="item.path" | 26 | :key="item.path" |
26 | - @click="hanldeModuleClick(item.path)" | 27 | + v-bind="getItemEvents(item)" |
27 | > | 28 | > |
28 | <MenuTag :item="item" :showTitle="false" :isHorizontal="false" /> | 29 | <MenuTag :item="item" :showTitle="false" :isHorizontal="false" /> |
29 | <g-icon | 30 | <g-icon |
@@ -112,6 +113,7 @@ | @@ -112,6 +113,7 @@ | ||
112 | getCanDrag, | 113 | getCanDrag, |
113 | getCloseMixSidebarOnChange, | 114 | getCloseMixSidebarOnChange, |
114 | getMenuTheme, | 115 | getMenuTheme, |
116 | + getMixSideTrigger, | ||
115 | } = useMenuSetting(); | 117 | } = useMenuSetting(); |
116 | const { title } = useGlobSetting(); | 118 | const { title } = useGlobSetting(); |
117 | 119 | ||
@@ -125,6 +127,16 @@ | @@ -125,6 +127,16 @@ | ||
125 | } | 127 | } |
126 | ); | 128 | ); |
127 | 129 | ||
130 | + const getMenuEvents = computed(() => { | ||
131 | + return unref(getMixSideTrigger) === 'hover' | ||
132 | + ? { | ||
133 | + onMouseleave: () => { | ||
134 | + openMenu.value = false; | ||
135 | + }, | ||
136 | + } | ||
137 | + : {}; | ||
138 | + }); | ||
139 | + | ||
128 | const getShowDragBar = computed(() => unref(getCanDrag)); | 140 | const getShowDragBar = computed(() => unref(getCanDrag)); |
129 | 141 | ||
130 | onMounted(async () => { | 142 | onMounted(async () => { |
@@ -139,11 +151,13 @@ | @@ -139,11 +151,13 @@ | ||
139 | } | 151 | } |
140 | }); | 152 | }); |
141 | 153 | ||
142 | - async function hanldeModuleClick(path: string) { | 154 | + async function hanldeModuleClick(path: string, hover = false) { |
143 | const children = await getChildrenMenus(path); | 155 | const children = await getChildrenMenus(path); |
144 | 156 | ||
145 | if (unref(activePath) === path) { | 157 | if (unref(activePath) === path) { |
146 | - openMenu.value = !unref(openMenu); | 158 | + if (!hover) { |
159 | + openMenu.value = !unref(openMenu); | ||
160 | + } | ||
147 | if (!unref(openMenu)) { | 161 | if (!unref(openMenu)) { |
148 | setActive(); | 162 | setActive(); |
149 | } | 163 | } |
@@ -178,6 +192,17 @@ | @@ -178,6 +192,17 @@ | ||
178 | setActive(); | 192 | setActive(); |
179 | } | 193 | } |
180 | 194 | ||
195 | + function getItemEvents(item: Menu) { | ||
196 | + if (unref(getMixSideTrigger) === 'hover') { | ||
197 | + return { | ||
198 | + onMouseenter: () => hanldeModuleClick(item.path, true), | ||
199 | + }; | ||
200 | + } | ||
201 | + return { | ||
202 | + onClick: () => hanldeModuleClick(item.path), | ||
203 | + }; | ||
204 | + } | ||
205 | + | ||
181 | return { | 206 | return { |
182 | t, | 207 | t, |
183 | prefixCls, | 208 | prefixCls, |
@@ -194,6 +219,8 @@ | @@ -194,6 +219,8 @@ | ||
194 | title, | 219 | title, |
195 | openMenu, | 220 | openMenu, |
196 | getMenuTheme, | 221 | getMenuTheme, |
222 | + getItemEvents, | ||
223 | + getMenuEvents, | ||
197 | }; | 224 | }; |
198 | }, | 225 | }, |
199 | }); | 226 | }); |
src/settings/projectSetting.ts
@@ -108,6 +108,8 @@ const setting: ProjectConfig = { | @@ -108,6 +108,8 @@ const setting: ProjectConfig = { | ||
108 | accordion: true, | 108 | accordion: true, |
109 | // Switch page to close menu | 109 | // Switch page to close menu |
110 | closeMixSidebarOnChange: false, | 110 | closeMixSidebarOnChange: false, |
111 | + // Module opening method ‘click’ |'hover' | ||
112 | + mixSideTrigger: 'hover', | ||
111 | }, | 113 | }, |
112 | 114 | ||
113 | // Multi-label | 115 | // Multi-label |
src/types/config.d.ts
@@ -20,6 +20,7 @@ export interface MenuSetting { | @@ -20,6 +20,7 @@ export interface MenuSetting { | ||
20 | accordion: boolean; | 20 | accordion: boolean; |
21 | closeMixSidebarOnChange: boolean; | 21 | closeMixSidebarOnChange: boolean; |
22 | collapsedShowTitle: boolean; | 22 | collapsedShowTitle: boolean; |
23 | + mixSideTrigger: 'click' | 'hover'; | ||
23 | } | 24 | } |
24 | 25 | ||
25 | export interface MultiTabsSetting { | 26 | export interface MultiTabsSetting { |