提交 | 用户 | age
|
2f1255
|
1 |
import { MenuModeEnum } from '/@/enums/menuEnum'; |
2f6253
|
2 |
import type { Menu as MenuType } from '/@/router/types'; |
74e62c
|
3 |
import type { MenuState } from './types'; |
88f4a3
|
4 |
|
8e5a6b
|
5 |
import { computed, Ref, toRaw, unref } from 'vue'; |
2f6253
|
6 |
|
be3a3e
|
7 |
import { uniq } from 'lodash-es'; |
ba068b
|
8 |
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; |
88f4a3
|
9 |
import { getAllParentPath } from '/@/router/helper/menuHelper'; |
97180e
|
10 |
import { useTimeoutFn } from '/@/hooks/core/useTimeout'; |
2f6253
|
11 |
|
陈 |
12 |
export function useOpenKeys( |
|
13 |
menuState: MenuState, |
|
14 |
menus: Ref<MenuType[]>, |
4ff6b7
|
15 |
mode: Ref<MenuModeEnum>, |
56a966
|
16 |
accordion: Ref<boolean>, |
2f6253
|
17 |
) { |
0e7c57
|
18 |
const { getCollapsed, getIsMixSidebar } = useMenuSetting(); |
74e62c
|
19 |
|
97180e
|
20 |
async function setOpenKeys(path: string) { |
819bcb
|
21 |
if (mode.value === MenuModeEnum.HORIZONTAL) { |
V |
22 |
return; |
|
23 |
} |
0e7c57
|
24 |
const native = unref(getIsMixSidebar); |
97180e
|
25 |
useTimeoutFn( |
V |
26 |
() => { |
|
27 |
const menuList = toRaw(menus.value); |
0e7c57
|
28 |
if (menuList?.length === 0) { |
V |
29 |
menuState.openKeys = []; |
|
30 |
return; |
|
31 |
} |
97180e
|
32 |
if (!unref(accordion)) { |
be3a3e
|
33 |
menuState.openKeys = uniq([...menuState.openKeys, ...getAllParentPath(menuList, path)]); |
97180e
|
34 |
} else { |
V |
35 |
menuState.openKeys = getAllParentPath(menuList, path); |
|
36 |
} |
|
37 |
}, |
|
38 |
16, |
56a966
|
39 |
!native, |
97180e
|
40 |
); |
2f6253
|
41 |
} |
88f4a3
|
42 |
|
V |
43 |
const getOpenKeys = computed(() => { |
9c2f3f
|
44 |
const collapse = unref(getIsMixSidebar) ? false : unref(getCollapsed); |
V |
45 |
|
|
46 |
return collapse ? menuState.collapsedOpenKeys : menuState.openKeys; |
88f4a3
|
47 |
}); |
4ff6b7
|
48 |
|
2f6253
|
49 |
/** |
陈 |
50 |
* @description: 重置值 |
|
51 |
*/ |
|
52 |
function resetKeys() { |
|
53 |
menuState.selectedKeys = []; |
|
54 |
menuState.openKeys = []; |
|
55 |
} |
|
56 |
|
|
57 |
function handleOpenChange(openKeys: string[]) { |
9c2f3f
|
58 |
if (unref(mode) === MenuModeEnum.HORIZONTAL || !unref(accordion) || unref(getIsMixSidebar)) { |
2f1255
|
59 |
menuState.openKeys = openKeys; |
2f6253
|
60 |
} else { |
a65ad9
|
61 |
// const menuList = toRaw(menus.value); |
V |
62 |
// getAllParentPath(menuList, path); |
2f1255
|
63 |
const rootSubMenuKeys: string[] = []; |
V |
64 |
for (const { children, path } of unref(menus)) { |
|
65 |
if (children && children.length > 0) { |
|
66 |
rootSubMenuKeys.push(path); |
|
67 |
} |
|
68 |
} |
74e62c
|
69 |
if (!unref(getCollapsed)) { |
2f1255
|
70 |
const latestOpenKey = openKeys.find((key) => menuState.openKeys.indexOf(key) === -1); |
V |
71 |
if (rootSubMenuKeys.indexOf(latestOpenKey as string) === -1) { |
|
72 |
menuState.openKeys = openKeys; |
|
73 |
} else { |
|
74 |
menuState.openKeys = latestOpenKey ? [latestOpenKey] : []; |
|
75 |
} |
|
76 |
} else { |
|
77 |
menuState.collapsedOpenKeys = openKeys; |
|
78 |
} |
2f6253
|
79 |
} |
陈 |
80 |
} |
88f4a3
|
81 |
return { setOpenKeys, resetKeys, getOpenKeys, handleOpenChange }; |
2f6253
|
82 |
} |