2019-01-12 11:33:27 +08:00
|
|
|
import PropTypes from '../_util/vue-types';
|
2020-01-19 16:58:38 +08:00
|
|
|
import { getStyle, getComponentFromProp, getListeners } from '../_util/props-util';
|
2019-01-12 11:33:27 +08:00
|
|
|
import BaseMixin from '../_util/BaseMixin';
|
2018-03-19 10:16:27 +08:00
|
|
|
|
2019-01-12 11:33:27 +08:00
|
|
|
function noop() {}
|
2019-01-01 21:19:50 +08:00
|
|
|
|
2018-02-05 19:12:41 +08:00
|
|
|
export default {
|
|
|
|
mixins: [BaseMixin],
|
|
|
|
props: {
|
|
|
|
duration: PropTypes.number.def(1.5),
|
2018-02-06 15:21:13 +08:00
|
|
|
closable: PropTypes.bool,
|
|
|
|
prefixCls: PropTypes.string,
|
2018-09-05 21:28:54 +08:00
|
|
|
update: PropTypes.bool,
|
2018-11-08 19:59:09 +08:00
|
|
|
closeIcon: PropTypes.any,
|
2018-02-05 19:12:41 +08:00
|
|
|
},
|
2019-02-01 17:23:00 +08:00
|
|
|
watch: {
|
|
|
|
duration() {
|
|
|
|
this.restartCloseTimer();
|
|
|
|
},
|
|
|
|
},
|
2018-02-05 19:12:41 +08:00
|
|
|
|
2019-01-12 11:33:27 +08:00
|
|
|
mounted() {
|
|
|
|
this.startCloseTimer();
|
2018-02-05 19:12:41 +08:00
|
|
|
},
|
2019-01-12 11:33:27 +08:00
|
|
|
updated() {
|
2018-09-05 21:28:54 +08:00
|
|
|
if (this.update) {
|
2019-01-12 11:33:27 +08:00
|
|
|
this.restartCloseTimer();
|
2018-09-05 21:28:54 +08:00
|
|
|
}
|
|
|
|
},
|
2018-02-05 19:12:41 +08:00
|
|
|
|
2019-01-12 11:33:27 +08:00
|
|
|
beforeDestroy() {
|
|
|
|
this.clearCloseTimer();
|
|
|
|
this.willDestroy = true; // beforeDestroy调用后依然会触发onMouseleave事件
|
2018-02-05 19:12:41 +08:00
|
|
|
},
|
|
|
|
methods: {
|
2019-03-04 12:12:50 +08:00
|
|
|
close(e) {
|
|
|
|
if (e) {
|
|
|
|
e.stopPropagation();
|
|
|
|
}
|
2019-01-12 11:33:27 +08:00
|
|
|
this.clearCloseTimer();
|
|
|
|
this.__emit('close');
|
2018-02-05 19:12:41 +08:00
|
|
|
},
|
|
|
|
|
2019-01-12 11:33:27 +08:00
|
|
|
startCloseTimer() {
|
|
|
|
this.clearCloseTimer();
|
2018-02-06 15:21:13 +08:00
|
|
|
if (!this.willDestroy && this.duration) {
|
2018-02-05 19:12:41 +08:00
|
|
|
this.closeTimer = setTimeout(() => {
|
2019-01-12 11:33:27 +08:00
|
|
|
this.close();
|
|
|
|
}, this.duration * 1000);
|
2018-02-05 19:12:41 +08:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2019-01-12 11:33:27 +08:00
|
|
|
clearCloseTimer() {
|
2018-02-05 19:12:41 +08:00
|
|
|
if (this.closeTimer) {
|
2019-01-12 11:33:27 +08:00
|
|
|
clearTimeout(this.closeTimer);
|
|
|
|
this.closeTimer = null;
|
2018-02-05 19:12:41 +08:00
|
|
|
}
|
|
|
|
},
|
2019-01-12 11:33:27 +08:00
|
|
|
restartCloseTimer() {
|
|
|
|
this.clearCloseTimer();
|
|
|
|
this.startCloseTimer();
|
2018-09-05 21:28:54 +08:00
|
|
|
},
|
2018-02-05 19:12:41 +08:00
|
|
|
},
|
|
|
|
|
2019-01-12 11:33:27 +08:00
|
|
|
render() {
|
2020-01-19 16:58:38 +08:00
|
|
|
const { prefixCls, closable, clearCloseTimer, startCloseTimer, $slots, close } = this;
|
2019-01-12 11:33:27 +08:00
|
|
|
const componentClass = `${prefixCls}-notice`;
|
2018-02-05 19:12:41 +08:00
|
|
|
const className = {
|
|
|
|
[`${componentClass}`]: 1,
|
|
|
|
[`${componentClass}-closable`]: closable,
|
2019-01-12 11:33:27 +08:00
|
|
|
};
|
|
|
|
const style = getStyle(this);
|
|
|
|
const closeIcon = getComponentFromProp(this, 'closeIcon');
|
2018-02-05 19:12:41 +08:00
|
|
|
return (
|
2019-01-01 21:19:50 +08:00
|
|
|
<div
|
|
|
|
class={className}
|
2019-01-12 11:33:27 +08:00
|
|
|
style={style || { right: '50%' }}
|
2019-01-01 21:19:50 +08:00
|
|
|
onMouseenter={clearCloseTimer}
|
2018-02-05 19:12:41 +08:00
|
|
|
onMouseleave={startCloseTimer}
|
2020-01-19 16:58:38 +08:00
|
|
|
onClick={getListeners(this).click || noop}
|
2018-02-05 19:12:41 +08:00
|
|
|
>
|
|
|
|
<div class={`${componentClass}-content`}>{$slots.default}</div>
|
2019-01-12 11:33:27 +08:00
|
|
|
{closable ? (
|
|
|
|
<a tabIndex="0" onClick={close} class={`${componentClass}-close`}>
|
|
|
|
{closeIcon || <span class={`${componentClass}-close-x`} />}
|
|
|
|
</a>
|
|
|
|
) : null}
|
2018-02-05 19:12:41 +08:00
|
|
|
</div>
|
2019-01-12 11:33:27 +08:00
|
|
|
);
|
2018-02-05 19:12:41 +08:00
|
|
|
},
|
2019-01-12 11:33:27 +08:00
|
|
|
};
|