Commit 0419a070413be34ea5455ed955fa51d8c522da86

Authored by vben
1 parent 799a694b

feat(menu): add mixSideTrigger setting

CHANGELOG.zh_CN.md
  1 +## Wip
  2 +
  3 +### ✨ Features
  4 +
  5 +- 新增`mixSideTrigger`配置。用于配置左侧混合模式菜单打开方式。可选`hover`,默认`click`
  6 +
1 ## 2.0.0-rc.15 (2020-12-31) 7 ## 2.0.0-rc.15 (2020-12-31)
2 8
3 ### ✨ 表格破坏性更新 9 ### ✨ 表格破坏性更新
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 {