import { Menu } from 'antd'; const SubMenu = Menu.SubMenu; const ItemMenu = Menu.Item; import cloneDeep from 'lodash/cloneDeep'; import { addContentPath } from '../util/pathUtil'; class WeaMenuInline extends React.Component { constructor(props) { super(props); const openKeys = this.getOpenKeys(props.defaultSelectedKey, props.datas); // console.log("openKeys1:",openKeys); this.state = { mode: props.mode || 'Inline', datas: props.datas || [], inlineWidth: props.inlineWidth || 197, verticalWidth: props.verticalWidth || 61, fontSize: props.fontSize, openKeys: openKeys || [], selectedKey: props.defaultSelectedKey || '', // 包含SubMenu,只做单选 defaultSelectedKey: props.defaultSelectedKey || '', // 包含SubMenu,只做单选 canClick: true, selectedType: 0, }; } componentWillReceiveProps(nextProps) { // console.log('datas:',this.props.datas,nextProps.datas,this.props.datas.toString() !== nextProps.datas.toString()); // console.log('defaultSelectedKey',this.props.defaultSelectedKey,nextProps.defaultSelectedKey,this.props.defaultSelectedKey !== nextProps.defaultSelectedKey); // console.log('defaultSelectedKey',this.state.defaultSelectedKey,nextProps.defaultSelectedKey,this.state.defaultSelectedKey !== nextProps.defaultSelectedKey); const openKeys = this.getOpenKeys(nextProps.defaultSelectedKey, nextProps.datas); if ( JSON.stringify(this.props.datas) !== JSON.stringify(nextProps.datas) || (this.props.defaultSelectedKey !== nextProps.defaultSelectedKey && this.state.defaultSelectedKey !== nextProps.defaultSelectedKey) || this.props.fontSize !== nextProps.fontSize ) { // 计算出openKeys let newProps = { datas: nextProps.datas || [], fontSize: nextProps.fontSize, openKeys: openKeys || [], defaultSelectedKey: nextProps.defaultSelectedKey || '', selectedKey: nextProps.defaultSelectedKey || '', }; // if(this.props.defaultSelectedKey !== nextProps.defaultSelectedKey&&this.state.defaultSelectedKey !== nextProps.defaultSelectedKey) // newProps.openKeys = this.getOpenKeys(nextProps.defaultSelectedKey,nextProps.datas); this.setState(newProps); } } render() { const { mode, datas, verticalWidth } = this.state; const { openKeys, selectedType } = this.state; let that = this; return ( { that.changeOpen(e.openKeys); }} onClose={(e) => { that.changeClose(e.openKeys); }} onClick={(e) => { that.changeSelectedKey(e.key, that.getDataByKey(e.key, datas), 0); }} > {this.renderMenuItem(datas, 1)} ); } getOpenKeys(key, datas) { const data = this.getDataByKey(key, datas); const treeKey = data.treeKey; let treeKeyArr = treeKey ? treeKey.split('{$}') : []; // console.log("treeKey:",treeKey," treeKeyArr:",treeKeyArr); return treeKeyArr; } onModeChange() { const { mode } = this.state; if (typeof this.props.onModeChange == 'function') { this.props.onModeChange(mode); } } getDataByKey(key, datas) { let that = this; let obj = ''; for (let i = 0; i < datas.length && obj == ''; i++) { if (datas[i].id == key) { obj = cloneDeep(datas[i]); } if (obj == '' && datas[i].child && datas[i].child.length > 0) { obj = that.getDataByKey(key, datas[i].child); } } return obj; } changeSelectedKey(key, data, type) { if (window.event && window.event.shiftKey) { window.open(addContentPath(data.fullrouteurl || data.url), '_blank'); return; } if (data && data.target != 'mainFrame') { window.open(addContentPath(data.fullrouteurl || data.url), data.target); return; } const { canClick } = this.state; const { clickBlock } = this.props; const that = this; // let d = new Date(); // console.log(canClick,d.getTime()); if (canClick) { this.setState({ canClick: false, selectedKey: key, selectedType: type, }); if (typeof this.props.onSelect == 'function') { this.props.onSelect(key, data, type); } setTimeout(() => { that.setState({ canClick: true }); }, clickBlock || 300); } } changeOpen(openKeys) { this.setState({ openKeys, }); if (typeof this.props.onOpenCallback == 'function') { this.props.onOpenCallback(); } } changeClose(openKeys) { this.setState({ openKeys, }); } renderMenuItem(datas, level) { const selectedClassName = 'wea-menu-selected'; let that = this; const { selectedKey, canClick } = this.state; let datasArr = new Array(); for (let i = 0; i < datas.length; i++) { const data = datas[i]; const isSubMenu = data.child && data.child.length > 0; const isSelected = selectedKey == data.id || `verTop_${selectedKey}` == data.id; if (data.isInlineHide !== 'true') { if (isSubMenu) { datasArr.push( { that.changeSelectedKey(e.key, data, 0); }} title={that.renderTitle(data, level)} > {that.renderMenuItem(data.child, level + 1)} , ); } else { datasArr.push( {that.renderTitle(data, level)} , ); } } } return datasArr; } renderTitle(data, level) { const { verticalWidth, fontSize } = this.state; const that = this; const needIcon = level == 1; const underLineStyle = data.hasUnderLine == 'true' ? { borderBottom: '1px solid #bbb' } : {}; const topLineStyle = data.hasTopLine == 'true' ? { borderTop: '1px solid #bbb' } : {}; const borderStyle = Object.assign({ position: 'relative', height: '42px' }, underLineStyle, topLineStyle); const outStyle = { position: 'absolute', display: 'inline-block', width: needIcon ? '65%' : '90%', height: '42px' }; const innerStyle = { display: 'inline-block', maxWidth: data.countId ? 'calc(100% - 40px)' : '92%', overflow: 'hidden', whiteSpace: 'nowrap', textOverflow: 'ellipsis' }; const tagStyle = data.tagColor ? { display: 'inline-block', width: '10px', height: '10px', border: '1px solid #bbb', backgroundColor: data.tagColor, verticalAlign: '16px' } : {}; const countStyle = data.countId ? { display: 'inline-block', width: '40px', overflow: 'hidden' } : {}; const iconMarginR = verticalWidth / 2 - 9; const iconCom = data.iconType == '2' && data.iconImgSrc ? ( { data.titleUrlIcon && data.titleUrlName && that.changeSelectedKey(data.id, data, 1); data.titleUrlIcon && data.titleUrlName && e.stopPropagation(); }} /> ) : data.icon ? ( { data.titleUrlIcon && data.titleUrlName && that.changeSelectedKey(data.id, data, 1); data.titleUrlIcon && data.titleUrlName && e.stopPropagation(); }} /> ) : ( { data.titleUrlIcon && data.titleUrlName && that.changeSelectedKey(data.id, data, 1); data.titleUrlIcon && data.titleUrlName && e.stopPropagation(); }} /> ); const urlIconCom = data.titleUrlIcon && !data.titleUrlName ? ( { that.changeSelectedKey(data.id, data, 1); e.stopPropagation(); }} /> ) : null; return (
{needIcon ? iconCom : ''}
{data.tagColor && } {data.name} {data.countId && }
{urlIconCom}
); } } export default WeaMenuInline;