taro-material
Version:
Mini Program components that implement Google's Material Design.
88 lines (78 loc) • 2.03 kB
JavaScript
import Nerv from "nervjs";
import Taro from "@tarojs/taro-h5";
import PropTypes from 'prop-types';
import { View } from '@tarojs/components';
import classNames from 'classnames';
import AtComponent from "../../common/component";
export default class AtMessage extends AtComponent {
constructor() {
super(...arguments);
this.state = {
_isOpened: false,
_message: '',
_type: 'info',
_duration: 3000
};
this._timer = null;
}
bindMessageListener() {
Taro.eventCenter.on('atMessage', (options = {}) => {
const { message, type, duration } = options;
const newState = {
_isOpened: true,
_message: message,
_type: type,
_duration: duration || this.state._duration
};
this.setState(newState, () => {
clearTimeout(this._timer);
this._timer = setTimeout(() => {
this.setState({
_isOpened: false
});
}, this.state._duration);
});
});
// 绑定函数
Taro.atMessage = Taro.eventCenter.trigger.bind(Taro.eventCenter, 'atMessage');
}
componentDidShow() {
this.bindMessageListener();
}
componentDidMount() {
this.bindMessageListener();
}
componentDidHide() {
Taro.eventCenter.off('atMessage');
}
componentWillUnmount() {
Taro.eventCenter.off('atMessage');
}
render() {
const {
className,
customStyle
} = this.props;
const {
_message,
_isOpened,
_type
} = this.state;
const rootCls = classNames({
'at-message': true,
'at-message--show': _isOpened,
'at-message--hidden': !_isOpened
}, `at-message--${_type}`, className);
return <View className={rootCls} style={customStyle}>
{_message}
</View>;
}
}
AtMessage.defaultProps = {
customStyle: '',
className: ''
};
AtMessage.propTypes = {
customStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),
className: PropTypes.oneOfType([PropTypes.array, PropTypes.string])
};