@minix-iot/ui
Version:
基于Vue的移动端轻量级UI组件库
162 lines (159 loc) • 3.94 kB
JSX
import Overlay from '../overlay/overlay.jsx';
import Icon from '../icon/icon.jsx';
import Loading from '../loading/loading.jsx';
import { Namespace } from '../../utils/namespace';
const namespace = Namespace.Create('toast');
export default {
name: namespace.name,
components: {
Overlay,
Icon,
Loading
},
props: {
show: {
type: Boolean,
default: false
},
overlay: {
type: Boolean,
default: false
},
zIndex: {
type: Number,
default: 1030
},
duration: {
type: Number,
default: 1600
},
overlayStyle: {
type: Object,
default: () => { }
},
closeOnClickOveraly: {
type: Boolean,
default: true
},
position: {
type: String,
default: 'center'
},
message: {
type: String,
default: ''
},
theme: {
type: String,
default: 'dark'
},
icon: {
type: String,
default: ''
},
loading: {
type: Boolean,
default: false
}
},
data() {
return {
timer: 0
};
},
computed: {
cls() {
return namespace.derive([
this.theme,
this.position,
{
round: this.round,
icon: this.hasIcon && !this.message,
it: this.hasIcon && this.message
}
]);
},
textCls() {
return namespace.derive('text', [
this.theme,
{
icon: this.hasIcon
}
]);
},
transitionName() {
return namespace.derive('fade');
},
hasIcon(){
return this.icon || this.loading
}
},
watch: {
show() {
this.toast();
}
},
methods: {
onClickOverlay(e) {
if (this.closeOnClickOveraly) {
this.close(e);
}
},
onClose(e) {
this.close(e);
},
close(e) {
this.$emit('close', e);
},
clearTimer() {
window.clearTimeout(this.timer);
},
toast() {
this.clearTimer();
if (this.show && this.duration) {
this.timer = window.setTimeout(() => {
this.close();
}, this.duration);
}
}
},
render(){
const renderIcon = ()=>{
if(this.loading){
return <Loading size="32" type="spinner"/>
}
if(this.icon){
return <Icon name={this.icon} size="32" />
}
}
const renderOverlay = ()=> {
if(this.overlay){
return <Overlay
show={this.show}
z-index = {this.zIndex}
lock-scroll={this.lockScroll}
overlay-style={this.overlayStyle}
onClick = {this.onClickOverlay}
/>
}
}
const renderToast = ()=> (
<transition name={this.transitionName}>
{
this.show && (
<div class={this.cls}>
{renderIcon()}
{this.message && <div class={this.textCls}>{this.message}</div>}
</div>
)
}
</transition>
)
return (
<div>
{renderOverlay()}
{renderToast()}
</div>
)
}
}