@ustack/uskin
Version:
A graceful framework which provides developers another chance to build an amazing site.
84 lines (70 loc) • 2 kB
JSX
import React from 'react';
const ITEM_HEIGHT = 40;
class MenuItem extends React.Component {
constructor(props) {
super(props);
this.state = {
toggle: props.toggle && !!props.item.fold
};
['toggle'].forEach((func) => {
this[func] = this[func].bind(this);
});
}
toggle(e) {
this.setState({
toggle: !this.state.toggle
});
}
onClick(key, item, e) {
this.props.onChange(e, key, item.key);
if (typeof item.onClick === 'function') {
item.onClick(e, item);
} else {
this.props.onClick(e, item);
}
}
isSelected(menu) {
let selected = this.props.selected;
return this.props.item.key === selected.key && menu.key === selected.subkey;
}
render() {
const props = this.props;
const state = this.state;
let enableToggle = props.toggle;
let item = props.item;
let toggle = state.toggle;
return (
<div>
{
item.title ? (
<h6 onClick={enableToggle ? this.toggle : null} className={enableToggle ? 'menu-title-toggle' : null}>
{item.title}
{
enableToggle ?
<i className={'icon-arrow-up glyphicon' + (toggle ? ' rotate' : '')}></i>
: null
}
</h6>
) : null
}
<ul style={{height: toggle ? 0 : ITEM_HEIGHT * item.submenu.length}} className={enableToggle ? 'menu-item-toggle' : null}>
{
item.submenu.map((ele, i) =>
<li key={i}
className={this.isSelected(ele) ? 'menu-item-selected' : null}
onClick={this.isSelected(ele) ? null : this.onClick.bind(this, item.key, ele)}>
{
ele.iconClass ?
<i className={ele.iconClass} />
: null
}
{ele.subtitle}
</li>
)
}
</ul>
</div>
);
}
}
export default MenuItem;