Commit 1dab3e29 authored by ι™ˆεΈ…'s avatar ι™ˆεΈ…

Reduce menu renderings

parent b588df34
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import { Menu, Icon } from 'antd'; import { Menu, Icon } from 'antd';
import Link from 'umi/link'; import Link from 'umi/link';
import isEqual from 'lodash/isEqual';
import memoizeOne from 'memoize-one';
import { formatMessage } from 'umi/locale'; import { formatMessage } from 'umi/locale';
import pathToRegexp from 'path-to-regexp'; import pathToRegexp from 'path-to-regexp';
import { urlToList } from '../_utils/pathTools'; import { urlToList } from '../_utils/pathTools';
...@@ -22,12 +24,15 @@ const getIcon = icon => { ...@@ -22,12 +24,15 @@ const getIcon = icon => {
return icon; return icon;
}; };
export const getMenuMatches = (flatMenuKeys, path) => export const getMenuMatches = memoizeOne(
flatMenuKeys.filter(item => item && pathToRegexp(item).test(path)); (flatMenuKeys, path) => flatMenuKeys.filter(item => item && pathToRegexp(item).test(path)),
isEqual
);
export default class BaseMenu extends PureComponent { export default class BaseMenu extends PureComponent {
constructor(props) { constructor(props) {
super(props); super(props);
this.getSelectedMenuKeys = memoizeOne(this.getSelectedMenuKeys, isEqual);
this.flatMenuKeys = this.getFlatMenuKeys(props.menuData); this.flatMenuKeys = this.getFlatMenuKeys(props.menuData);
} }
...@@ -66,12 +71,10 @@ export default class BaseMenu extends PureComponent { ...@@ -66,12 +71,10 @@ export default class BaseMenu extends PureComponent {
}; };
// Get the currently selected menu // Get the currently selected menu
getSelectedMenuKeys = () => { getSelectedMenuKeys = pathname =>
const { urlToList(pathname).map(function(itemPath) {
location: { pathname }, return getMenuMatches(this.flatMenuKeys, itemPath).pop();
} = this.props; });
return urlToList(pathname).map(itemPath => getMenuMatches(this.flatMenuKeys, itemPath).pop());
};
/** /**
* get SubMenu or Item * get SubMenu or Item
...@@ -158,9 +161,14 @@ export default class BaseMenu extends PureComponent { ...@@ -158,9 +161,14 @@ export default class BaseMenu extends PureComponent {
}; };
render() { render() {
const { openKeys, theme, mode } = this.props; const {
openKeys,
theme,
mode,
location: { pathname },
} = this.props;
// if pathname can't match, use the nearest parent's key // if pathname can't match, use the nearest parent's key
let selectedKeys = this.getSelectedMenuKeys(); let selectedKeys = this.getSelectedMenuKeys(pathname);
if (!selectedKeys.length && openKeys) { if (!selectedKeys.length && openKeys) {
selectedKeys = [openKeys[openKeys.length - 1]]; selectedKeys = [openKeys[openKeys.length - 1]];
} }
......
...@@ -46,6 +46,8 @@ function formatter(data, parentPath = '', parentAuthority, parentName) { ...@@ -46,6 +46,8 @@ function formatter(data, parentPath = '', parentAuthority, parentName) {
}); });
} }
const memoizeOneFormatter = memoizeOne(formatter, isEqual);
const query = { const query = {
'screen-xs': { 'screen-xs': {
maxWidth: 575, maxWidth: 575,
...@@ -136,7 +138,7 @@ class BasicLayout extends React.PureComponent { ...@@ -136,7 +138,7 @@ class BasicLayout extends React.PureComponent {
const { const {
route: { routes }, route: { routes },
} = this.props; } = this.props;
return formatter(routes); return memoizeOneFormatter(routes);
} }
/** /**
......
...@@ -121,7 +121,7 @@ class Monitor extends PureComponent { ...@@ -121,7 +121,7 @@ class Monitor extends PureComponent {
<Card <Card
title={ title={
<FormattedMessage <FormattedMessage
id="app.monitor.total-activity-forecast" id="app.monitor.activity-forecast"
defaultMessage="Activity forecast" defaultMessage="Activity forecast"
/> />
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment