import React, { PureComponent } from 'react'; import { Layout } from 'antd'; import classNames from 'classnames'; import Link from 'umi/link'; import styles from './index.less'; import BaseMenu, { getMenuMatches } from './BaseMenu'; import { urlToList } from '../_utils/pathTools'; const { Sider } = Layout; /** * 获得菜单子节点 * @memberof SiderMenu */ const getDefaultCollapsedSubMenus = props => { const { location: { pathname }, flatMenuKeys, } = props; return urlToList(pathname) .map(item => getMenuMatches(flatMenuKeys, item)[0]) .filter(item => item); }; export default class SiderMenu extends PureComponent { constructor(props) { super(props); this.state = { openKeys: getDefaultCollapsedSubMenus(props), }; } static getDerivedStateFromProps(props, state) { const { pathname } = state; if (props.location.pathname !== pathname) { return { pathname: props.location.pathname, openKeys: getDefaultCollapsedSubMenus(props), }; } return null; } isMainMenu = key => { const { menuData } = this.props; return menuData.some(item => { if (key) { return item.key === key || item.path === key; } return false; }); }; handleOpenChange = openKeys => { const moreThanOne = openKeys.filter(openKey => this.isMainMenu(openKey)).length > 1; this.setState({ openKeys: moreThanOne ? [openKeys.pop()] : [...openKeys], }); }; render() { const { logo, collapsed, onCollapse, fixSiderbar, theme } = this.props; const { openKeys } = this.state; const defaultProps = collapsed ? {} : { openKeys }; const siderClassName = classNames(styles.sider, { [styles.fixSiderbar]: fixSiderbar, [styles.light]: theme === 'light', }); return ( ); } }