| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- 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 (
- <Sider
- trigger={null}
- collapsible
- collapsed={collapsed}
- breakpoint="lg"
- onCollapse={onCollapse}
- width={256}
- theme={theme}
- className={siderClassName}
- >
- <div className={styles.logo} id="logo">
- <Link to="/">
- <img src={logo} alt="logo" />
- <h1>Ant Design Pro</h1>
- </Link>
- </div>
- <BaseMenu
- {...this.props}
- mode="inline"
- handleOpenChange={this.handleOpenChange}
- style={{ padding: '16px 0', width: '100%' }}
- {...defaultProps}
- />
- </Sider>
- );
- }
- }
|