vant/packages/toast/Toast.js
2019-06-12 17:21:59 +08:00

118 lines
2.3 KiB
JavaScript

import { use, isDef } from '../utils';
import { PopupMixin } from '../mixins/popup';
import Icon from '../icon';
import Loading from '../loading';
const [sfc, bem] = use('toast');
export default sfc({
mixins: [PopupMixin],
props: {
icon: String,
className: null,
loadingType: String,
forbidClick: Boolean,
message: [String, Number],
type: {
type: String,
default: 'text'
},
position: {
type: String,
default: 'middle'
},
lockScroll: {
type: Boolean,
default: false
}
},
data() {
return {
clickable: false
};
},
mounted() {
this.toggleClickable();
},
destroyed() {
this.toggleClickable();
},
watch: {
value() {
this.toggleClickable();
},
forbidClick() {
this.toggleClickable();
}
},
methods: {
toggleClickable() {
const clickable = this.value && this.forbidClick;
if (this.clickable !== clickable) {
this.clickable = clickable;
const action = clickable ? 'add' : 'remove';
document.body.classList[action]('van-toast--unclickable');
}
},
/* istanbul ignore next */
onAfterEnter() {
this.$emit('opened');
if (this.onOpened) {
this.onOpened();
}
}
},
render(h) {
const { type, icon, message, loadingType } = this;
const hasIcon = icon || (type === 'success' || type === 'fail');
function ToastIcon() {
if (hasIcon) {
return <Icon class={bem('icon')} name={icon || type} />;
}
if (type === 'loading') {
return <Loading class={bem('loading')} color="white" type={loadingType} />;
}
}
function Message() {
if (!isDef(message) || message === '') {
return;
}
if (type === 'html') {
return <div class={bem('text')} domPropsInnerHTML={message} />;
}
return <div class={bem('text')}>{message}</div>;
}
return (
<transition name="van-fade" onAfterEnter={this.onAfterEnter}>
<div
vShow={this.value}
class={[
bem([this.position, { text: !hasIcon && type !== 'loading' }]),
this.className
]}
>
{ToastIcon()}
{Message()}
</div>
</transition>
);
}
});