taro-material
Version:
Mini Program components that implement Google's Material Design.
91 lines (77 loc) • 2.27 kB
JavaScript
import Nerv from "nervjs";
import Taro from "@tarojs/taro-h5";
import { View } from '@tarojs/components';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import _isFunction from 'lodash/isFunction';
import AtActionSheetBody from "./body/index";
import AtActionSheetHeader from "./header/index";
import AtActionSheetFooter from "./footer/index";
import AtComponent from "../../common/component";
export default class AtActionSheet extends AtComponent {
constructor(props) {
super(...arguments);
const { isOpened } = props;
this.state = {
_isOpened: isOpened
};
}
componentWillReceiveProps(nextProps) {
const { isOpened } = nextProps;
if (isOpened !== this.state._isOpened) {
this.setState({
_isOpened: isOpened
});
!isOpened && this.handleClose();
}
}
handleClose = () => {
if (_isFunction(this.props.onClose)) {
this.props.onClose();
}
};
handleCancel = () => {
if (_isFunction(this.props.onCancel)) {
return this.props.onCancel();
}
this.close();
};
close = () => {
this.setState({
_isOpened: false
}, this.handleClose);
};
handleTouchMove = e => {
e.stopPropagation();
e.preventDefault();
};
render() {
const { title, cancelText, className } = this.props;
const { _isOpened } = this.state;
const rootClass = classNames('at-action-sheet', {
'at-action-sheet--active': _isOpened
}, className);
return <View className={rootClass} onTouchMove={this.handleTouchMove}>
<View onClick={this.close} className="at-action-sheet__overlay" />
<View className="at-action-sheet__container">
{title && <AtActionSheetHeader>{title}</AtActionSheetHeader>}
<AtActionSheetBody>{this.props.children}</AtActionSheetBody>
{cancelText && <AtActionSheetFooter onClick={this.handleCancel}>
{cancelText}
</AtActionSheetFooter>}
</View>
</View>;
}
}
AtActionSheet.defaultProps = {
title: '',
cancelText: '',
isOpened: false
};
AtActionSheet.propTypes = {
title: PropTypes.string,
onClose: PropTypes.func,
onCancel: PropTypes.func,
isOpened: PropTypes.bool,
cancelText: PropTypes.string
};