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 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 33  
34 34 const getMenuBgColor = computed(() => unref(getMenuSetting).bgColor);
35 35  
  36 +const getMixSideTrigger = computed(() => unref(getMenuSetting).mixSideTrigger);
  37 +
36 38 const getCanDrag = computed(() => unref(getMenuSetting).canDrag);
37 39  
38 40 const getAccordion = computed(() => unref(getMenuSetting).accordion);
... ... @@ -145,5 +147,6 @@ export function useMenuSetting() {
145 147 getIsMixMode,
146 148 getIsMixSidebar,
147 149 getCloseMixSidebarOnChange,
  150 + getMixSideTrigger,
148 151 };
149 152 }
... ...
src/layouts/default/sider/MixSider.vue
... ... @@ -10,6 +10,7 @@
10 10 open: openMenu,
11 11 },
12 12 ]"
  13 + v-bind="getMenuEvents"
13 14 >
14 15 <AppLogo :showTitle="false" :class="`${prefixCls}-logo`" />
15 16 <ScrollContainer>
... ... @@ -23,7 +24,7 @@
23 24 ]"
24 25 v-for="item in menuModules"
25 26 :key="item.path"
26   - @click="hanldeModuleClick(item.path)"
  27 + v-bind="getItemEvents(item)"
27 28 >
28 29 <MenuTag :item="item" :showTitle="false" :isHorizontal="false" />
29 30 <g-icon
... ... @@ -112,6 +113,7 @@
112 113 getCanDrag,
113 114 getCloseMixSidebarOnChange,
114 115 getMenuTheme,
  116 + getMixSideTrigger,
115 117 } = useMenuSetting();
116 118 const { title } = useGlobSetting();
117 119  
... ... @@ -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 140 const getShowDragBar = computed(() => unref(getCanDrag));
129 141  
130 142 onMounted(async () => {
... ... @@ -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 155 const children = await getChildrenMenus(path);
144 156  
145 157 if (unref(activePath) === path) {
146   - openMenu.value = !unref(openMenu);
  158 + if (!hover) {
  159 + openMenu.value = !unref(openMenu);
  160 + }
147 161 if (!unref(openMenu)) {
148 162 setActive();
149 163 }
... ... @@ -178,6 +192,17 @@
178 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 206 return {
182 207 t,
183 208 prefixCls,
... ... @@ -194,6 +219,8 @@
194 219 title,
195 220 openMenu,
196 221 getMenuTheme,
  222 + getItemEvents,
  223 + getMenuEvents,
197 224 };
198 225 },
199 226 });
... ...
src/settings/projectSetting.ts
... ... @@ -108,6 +108,8 @@ const setting: ProjectConfig = {
108 108 accordion: true,
109 109 // Switch page to close menu
110 110 closeMixSidebarOnChange: false,
  111 + // Module opening method ‘click’ |'hover'
  112 + mixSideTrigger: 'hover',
111 113 },
112 114  
113 115 // Multi-label
... ...
src/types/config.d.ts
... ... @@ -20,6 +20,7 @@ export interface MenuSetting {
20 20 accordion: boolean;
21 21 closeMixSidebarOnChange: boolean;
22 22 collapsedShowTitle: boolean;
  23 + mixSideTrigger: 'click' | 'hover';
23 24 }
24 25  
25 26 export interface MultiTabsSetting {
... ...