react-mdl
Version:
React Components for Material Design Lite
61 lines (48 loc) • 1.7 kB
JavaScript
import React from 'react';
import PropTypes from 'prop-types';
import { findDOMNode } from 'react-dom';
import classNames from 'classnames';
import basicClassCreator from './utils/basicClassCreator';
const propTypes = {
align: PropTypes.oneOf(['left', 'right']),
className: PropTypes.string,
ripple: PropTypes.bool,
target: PropTypes.string.isRequired,
valign: PropTypes.oneOf(['bottom', 'top'])
};
const defaultProps = {
align: 'left',
valign: 'bottom'
};
// eslint-disable-next-line react/prefer-stateless-function
class Menu extends React.Component {
componentDidMount() {
window.componentHandler.upgradeElements(findDOMNode(this));
}
componentWillUnmount() {
const elt = findDOMNode(this);
window.componentHandler.downgradeElements(elt);
const parent = elt.parentElement;
const grandparent = parent && parent.parentElement;
if (parent && grandparent && parent.classList.contains('mdl-menu__container')) {
grandparent.replaceChild(elt, parent);
}
}
render() {
const { align, children, className, ripple,
target, valign, ...otherProps } = this.props;
const classes = classNames('mdl-menu mdl-js-menu', {
[`mdl-menu--${valign}-${align}`]: true,
'mdl-js-ripple-effect': ripple
}, className);
return (
<ul className={classes} data-mdl-for={target} {...otherProps}>
{children}
</ul>
);
}
}
Menu.propTypes = propTypes;
Menu.defaultProps = defaultProps;
export default Menu;
export const MenuItem = basicClassCreator('MenuItem', 'mdl-menu__item', 'li');