vben
2020-12-03 c303ec1a23c4b1fbad4fbda9007af2147dc327e2
提交 | 用户 | age
2f1255 1 import { MenuModeEnum } from '/@/enums/menuEnum';
2f6253 2 import type { Menu as MenuType } from '/@/router/types';
ba068b 3 import type { MenuState } from '../types';
2f6253 4 import type { Ref } from 'vue';
5
6 import { unref } from 'vue';
c303ec 7 import { getAllParentPath } from '/@/router/helper/menuHelper';
4ff6b7 8 import { es6Unique } from '/@/utils';
ba068b 9 import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
2f6253 10
11 export function useOpenKeys(
12   menuState: MenuState,
13   menus: Ref<MenuType[]>,
14   flatMenusRef: Ref<MenuType[]>,
2f1255 15   isAppMenu: Ref<boolean>,
4ff6b7 16   mode: Ref<MenuModeEnum>,
V 17   accordion: Ref<boolean>
2f6253 18 ) {
ba068b 19   const { getCollapsed } = useMenuSetting();
2f6253 20   /**
21    * @description:设置展开
22    */
23   function setOpenKeys(menu: MenuType) {
24     const flatMenus = unref(flatMenusRef);
4ff6b7 25     if (!unref(accordion)) {
V 26       menuState.openKeys = es6Unique([
27         ...menuState.openKeys,
28         ...getAllParentPath(flatMenus, menu.path),
29       ]);
30     } else {
31       menuState.openKeys = getAllParentPath(flatMenus, menu.path);
32     }
2f6253 33   }
4ff6b7 34
2f6253 35   /**
36    * @description:  重置值
37    */
38   function resetKeys() {
39     menuState.selectedKeys = [];
40     menuState.openKeys = [];
41   }
42
43   function handleOpenChange(openKeys: string[]) {
4ff6b7 44     if (unref(mode) === MenuModeEnum.HORIZONTAL || !unref(accordion)) {
2f1255 45       menuState.openKeys = openKeys;
2f6253 46     } else {
2f1255 47       const rootSubMenuKeys: string[] = [];
V 48       for (const { children, path } of unref(menus)) {
49         if (children && children.length > 0) {
50           rootSubMenuKeys.push(path);
51         }
52       }
ba068b 53       if (!unref(getCollapsed) || !unref(isAppMenu)) {
2f1255 54         const latestOpenKey = openKeys.find((key) => menuState.openKeys.indexOf(key) === -1);
V 55         if (rootSubMenuKeys.indexOf(latestOpenKey as string) === -1) {
56           menuState.openKeys = openKeys;
57         } else {
58           menuState.openKeys = latestOpenKey ? [latestOpenKey] : [];
59         }
60       } else {
61         menuState.collapsedOpenKeys = openKeys;
62       }
2f6253 63     }
64   }
65   return { setOpenKeys, resetKeys, handleOpenChange };
66 }