ym-mint-ui
Version:
750px for Mint UI
64 lines (54 loc) • 1.56 kB
JavaScript
import Vue from 'vue';
const ToastConstructor = Vue.extend(require('./toast.vue'));
let toastPool = [];
let isClosed = true;
let getAnInstance = () => {
if (toastPool.length > 0) {
let instance = toastPool[0];
toastPool.splice(0, 1);
return instance;
}
return new ToastConstructor({
el: document.createElement('div')
});
};
let returnAnInstance = instance => {
if (instance) {
toastPool.push(instance);
}
};
let removeDom = event => {
if (event.target.parentNode) {
event.target.parentNode.removeChild(event.target);
}
};
ToastConstructor.prototype.close = function() {
this.visible = false;
this.$el.addEventListener('transitionend', removeDom);
this.closed = true;
isClosed = true;
returnAnInstance(this);
};
let Toast = (options = {}) => {
if (!isClosed) return;
isClosed = false;
let duration = options.duration || 3000;
let instance = getAnInstance();
instance.closed = false;
clearTimeout(instance.timer);
instance.message = typeof options === 'string' ? options : options.message;
instance.position = options.position || 'middle';
instance.className = options.className || '';
instance.iconClass = options.iconClass || '';
document.body.appendChild(instance.$el);
Vue.nextTick(function() {
instance.visible = true;
instance.$el.removeEventListener('transitionend', removeDom);
~duration && (instance.timer = setTimeout(function() {
if (instance.closed) return;
instance.close();
}, duration));
});
return instance;
};
export default Toast;