|
@@ -3,7 +3,7 @@ import { FC, memo, useCallback, useMemo } from "react";
|
|
import { useLocation, useNavigate } from "react-router-dom";
|
|
import { useLocation, useNavigate } from "react-router-dom";
|
|
// import { CaretDownOutlined } from "@ant-design/icons";
|
|
// import { CaretDownOutlined } from "@ant-design/icons";
|
|
import { DageRouteItem } from "@/router";
|
|
import { DageRouteItem } from "@/router";
|
|
-import { findRouteByPath } from "../../utils";
|
|
|
|
|
|
+import { findRouteByPath, findVisibleRouteParent } from "../../utils";
|
|
|
|
|
|
export interface LayoutMenuProps extends Omit<MenuProps, "mode" | "items"> {
|
|
export interface LayoutMenuProps extends Omit<MenuProps, "mode" | "items"> {
|
|
/** 菜单内容 */
|
|
/** 菜单内容 */
|
|
@@ -15,6 +15,19 @@ export interface LayoutMenuProps extends Omit<MenuProps, "mode" | "items"> {
|
|
maxShowLevel?: number;
|
|
maxShowLevel?: number;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+const findSelectedKey = (
|
|
|
|
+ menuData: DageRouteItem[],
|
|
|
|
+ item: DageRouteItem
|
|
|
|
+): string | null => {
|
|
|
|
+ if (!item?.hide) {
|
|
|
|
+ return item.path;
|
|
|
|
+ } else {
|
|
|
|
+ const parent = findVisibleRouteParent(menuData, item.path);
|
|
|
|
+
|
|
|
|
+ return parent ? findSelectedKey(menuData, parent) : null;
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
export const LayoutMenu: FC<LayoutMenuProps> = memo(
|
|
export const LayoutMenu: FC<LayoutMenuProps> = memo(
|
|
({ menuData, maxShowLevel = 2, ...rest }) => {
|
|
({ menuData, maxShowLevel = 2, ...rest }) => {
|
|
const location = useLocation();
|
|
const location = useLocation();
|
|
@@ -33,6 +46,18 @@ export const LayoutMenu: FC<LayoutMenuProps> = memo(
|
|
return stack;
|
|
return stack;
|
|
}, [menuData, location]);
|
|
}, [menuData, location]);
|
|
|
|
|
|
|
|
+ const selectedKeys = useMemo(() => {
|
|
|
|
+ const stack = [];
|
|
|
|
+ const item = findRouteByPath(menuData, location.pathname);
|
|
|
|
+
|
|
|
|
+ if (item) {
|
|
|
|
+ const target = findSelectedKey(menuData, item);
|
|
|
|
+ target && stack.push(target);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return stack;
|
|
|
|
+ }, [menuData, location]);
|
|
|
|
+
|
|
const renderMenuItems = useCallback(
|
|
const renderMenuItems = useCallback(
|
|
(list: DageRouteItem[], level = 1): any[] => {
|
|
(list: DageRouteItem[], level = 1): any[] => {
|
|
const stack: DageRouteItem[] = [];
|
|
const stack: DageRouteItem[] = [];
|
|
@@ -75,10 +100,11 @@ export const LayoutMenu: FC<LayoutMenuProps> = memo(
|
|
|
|
|
|
return menuData.length ? (
|
|
return menuData.length ? (
|
|
<Menu
|
|
<Menu
|
|
|
|
+ key={menuData.length}
|
|
mode="inline"
|
|
mode="inline"
|
|
// expandIcon={<CaretDownOutlined />}
|
|
// expandIcon={<CaretDownOutlined />}
|
|
items={renderMenuItems(menuData)}
|
|
items={renderMenuItems(menuData)}
|
|
- selectedKeys={location.pathname.split("/").map((i) => `/${i}`)}
|
|
|
|
|
|
+ selectedKeys={selectedKeys}
|
|
defaultOpenKeys={defaultOpenKeys}
|
|
defaultOpenKeys={defaultOpenKeys}
|
|
onClick={handleMenu}
|
|
onClick={handleMenu}
|
|
{...rest}
|
|
{...rest}
|