import type { FC } from 'react'; import { useState, useEffect } from 'react'; import { Dropdown, Layout, Menu, Tabs, Tooltip } from 'antd'; import type { MenuProps } from 'antd'; import { Outlet, Link, useLocation, connect } from 'umi'; import PageAccess from '@/components/PageAccess'; import type { UserConnectedProps, UserModelState } from '@/models/user'; import LayoutWrapper from '@/components/LayoutWrapper'; import Nav from '@/components/Nav'; import Page404 from '@/pages/404'; import handleRecursiveNestedData from '@/utils/handleRecursiveNestedData'; import handleGetCurrentLocation from '@/utils/handleGetCurrentLocation'; import { MenuDataItem, ProLayout } from '@ant-design/pro-components'; import './index.less' import logo from '../assets/logo.svg'; import Icon, { DoubleRightOutlined, SmileOutlined } from '@ant-design/icons'; import { ProfileModelState } from '@/models/global'; import React from 'react'; const { Header, Content } = Layout; /** * 获取openKeys的方法 * @param currentLocation 当前位置, 由handleGetCurrentLocation方法返回 * @returns openKeys */ const handleGetOpenKeys = (currentLocation: API.MenuItem[] | []): string[] => { //currentLocation为空 if (!currentLocation.length) return ['']; //currentLocation只有一项 if (currentLocation.length === 1) { return currentLocation.map((item: API.MenuItem) => `${item.key}`); } const res = []; //currentLocation有多项, 只要前n-1项 for (let i = 0; i < currentLocation.length - 1; i++) { res.push(`${currentLocation[i].key}`); } return res; }; //自定义的layout页面, 顶部导航通栏+侧边栏(菜单)布局, 可根据需要做调整 const BasicLayout: FC<{ user: UserModelState, global: ProfileModelState, dispatch: any }> = (props) => { const [collapsed, setCollapsed] = useState(false); const [openKeys, setOpenKeys] = useState(['']); const { pathname } = useLocation(); const { dispatch, user: { menu, rootSubmenuKeys, indexAllMenuItemById, indexValidMenuItemByPath }, global: { } } = props; console.log('props', props); const validMenuItem = indexValidMenuItemByPath[pathname]; const selectedKeys = validMenuItem?.key; useEffect( () => { //每次页面重新渲染都要设置openKeys setOpenKeys( handleGetOpenKeys( handleGetCurrentLocation(indexValidMenuItemByPath[pathname], indexAllMenuItemById), ), ); }, [pathname, indexAllMenuItemById, indexValidMenuItemByPath], ); //Menu中的selectedKeys和openKeys不是一回事: //openKeys: //当前展开的SubMenu菜单项key数组, 有子菜单的父菜单, 当selectedKeys为没子菜单的父菜单时该值应该设为[''], //也就是关闭所有有子菜单的父菜单; //selectedKeys: //当前选中的菜单项key数组, 有子菜单则是子菜单(叶子节点), 没有子菜单则是父菜单(一级菜单), 始终是可选中的 //点击有子菜单的父菜单的回调 // const onOpenChange: MenuProps['onOpenChange'] = (keys) => { // setOpenKeys(keys) // console.log('keys', keys); // dispatch({ // namespace: "global/setProfileData", // payload: { // keys // } // }) // }; //所有MenuItem: //有children的: 一定都有path, lable不动, children下的label修改为 //无children的: 有path的label修改为, 没path的label不动 const consumableMenu = handleRecursiveNestedData( menu, (item: API.MenuItem) => ({ ...item, name: item.path ? ( {item.name} ) : item.name, }), ); // const consumableMenu: MenuDataItem[] = [ // { // path: '/', // name: 'Dashboard', // icon: , // }, // { // path: '/about', // name: 'Users', // icon: , // children: [ // { // path: '/about/u', // name: 'User List', // }, // { // path: '/about/m', // name: 'User Profile', // }, // ], // }, // ]; console.log('consumableMenu', consumableMenu); const location = useLocation(); // 改变panes const handleTabsPanes = (payload: any): void => { dispatch({ type: "global/saveTabsRoutes", payload: { data: payload, action: 'add' } }) }; return ( consumableMenu // menu } subMenuItemRender={(menuItemProps) => { if (menuItemProps.icon && typeof menuItemProps.icon === 'string') { const ele = React.createElement(Icon[menuItemProps.icon]) return
{ele} {menuItemProps.name}
; } return
{menuItemProps.name}
; }} menuItemRender={(menuItemProps, defaultDom) => { if ( menuItemProps.isUrl || !menuItemProps.path || location.pathname === menuItemProps.path ) { return defaultDom; } return { }}> {defaultDom} {/* {menuItemProps.name} */} ; }} breadcrumbRender={false} itemRender={(route, params, routes, paths) => { const first = routes.indexOf(route) === 0; return first ? ( {route.breadcrumbName} ) : ( {route.breadcrumbName} ); }} actionsRender={() =>