@yncoder/element-react
Version:
Element UI for React
70 lines (56 loc) • 1.44 kB
JSX
/* @flow */
import * as React from 'react';
import ReactDOM from 'react-dom';
import Popper from 'popper.js';
import { Component, PropTypes, Transition, View } from '../../libs';
type State = {
showPopper: boolean
};
export default class DropdownMenu extends Component {
state: State;
constructor(props: Object) {
super(props);
this.state = {
showPopper: false
}
}
onVisibleChange(visible: boolean): void {
this.setState({
showPopper: visible
})
}
onEnter(): void {
const parent = ReactDOM.findDOMNode(this.parent());
this.popperJS = new Popper(parent, this.refs.popper, {
placement: this.placement(),
modifiers: {
computeStyle: {
gpuAcceleration: false
}
}
});
}
onAfterLeave(): void {
this.popperJS.destroy();
}
parent(): Component {
return this.context.component;
}
placement(): string {
return `bottom-${this.parent().props.menuAlign}`;
}
render(): React.DOM {
return (
<Transition name="el-zoom-in-top" onEnter={this.onEnter.bind(this)} onAfterLeave={this.onAfterLeave.bind(this)}>
<View show={this.state.showPopper}>
<ul ref="popper" style={this.style()} className={this.className('el-dropdown-menu')}>
{this.props.children}
</ul>
</View>
</Transition>
)
}
}
DropdownMenu.contextTypes = {
component: PropTypes.any
};