vben
2023-04-05 8e5a6b7ce547ba8edb1d767bb4d820f3b66ff95a
提交 | 用户 | 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 }