src/components/indicator/Indicator.js
/**
* @author haw
*/
import React, {
PropTypes,
Component
} from 'react';
import {
IconLoading
} from '../icon';
import Portal from '../portal';
import {classNames} from '../util';
const prefix = 'indicator';
/**
* 活动指示器
*/
export default class Indicator extends Component {
/**
* 构造函数
* @param {Object} props 组件所使用的属性
* @param {PropTypes.node} [props.icon] 指示器要显示的图标
* @param {PropTypes.node} [props.content] 指示器要显示的内容
* @param {boolean} [props.visible] 活动指示器是否显示
* @param {number} [props.timeout] 活动指示器自动关闭的时间
* @param {function} props.close 关闭指示器的回调(配合 API 调用来使用,一般不用手动传)
* @param {Object} context
*/
constructor(props, context) {
super(props, context);
this.timer = null;
}
componentDidMount() {
this._delayClose();
}
componentDidUpdate() {
this._delayClose();
}
_delayClose() {
const {
visible,
timeout,
close,
onClose
} = this.props;
if (visible && timeout) {
clearTimeout(this.timer);
this.timer = setTimeout(() => {
onClose && onClose();
close && close();
}, timeout);
}
}
render() {
const {
icon,
content,
visible,
timeout,
close,
onClose,
className,
children,
...rest
} = this.props;
let clazz = classNames(prefix, {
[className]: className
});
if (!visible) {
return null;
}
return (
<div className={clazz} {...rest}>
{icon ? (
<div><IconLoading /></div>
) : null}
<p>{content || children}</p>
</div>
);
}
}
Indicator.propTypes = {
icon: PropTypes.node,
content: PropTypes.node,
visible: PropTypes.bool,
timeout: PropTypes.number,
close: PropTypes.func,
onClose: PropTypes.func,
className: PropTypes.string,
children: PropTypes.node
};
/**
* 活动指示器组件的 API 调用方法
* @param {Object} props @see Indicator 组件属性
* @param {Node} container 活动指示器的容器节点
*/
Indicator.show = (props, container) => {
props.timeout = props.timeout || 1500;
Portal.show(Indicator, props, container);
};