120 lines
3.1 KiB
JavaScript
120 lines
3.1 KiB
JavaScript
import { VantComponent } from '../common/component';
|
|
import { button } from '../mixins/button';
|
|
import { openType } from '../mixins/open-type';
|
|
import { addUnit } from '../common/utils';
|
|
import { GRAY, BLUE } from '../common/color';
|
|
VantComponent({
|
|
mixins: [button, openType],
|
|
props: {
|
|
show: Boolean,
|
|
title: String,
|
|
message: String,
|
|
useSlot: Boolean,
|
|
className: String,
|
|
customStyle: String,
|
|
asyncClose: Boolean,
|
|
messageAlign: String,
|
|
overlayStyle: String,
|
|
useTitleSlot: Boolean,
|
|
showCancelButton: Boolean,
|
|
closeOnClickOverlay: Boolean,
|
|
confirmButtonOpenType: String,
|
|
width: {
|
|
type: null,
|
|
observer: 'setWidthWithUnit'
|
|
},
|
|
zIndex: {
|
|
type: Number,
|
|
value: 2000
|
|
},
|
|
confirmButtonText: {
|
|
type: String,
|
|
value: '确认'
|
|
},
|
|
cancelButtonText: {
|
|
type: String,
|
|
value: '取消'
|
|
},
|
|
confirmButtonColor: {
|
|
type: String,
|
|
value: BLUE
|
|
},
|
|
cancelButtonColor: {
|
|
type: String,
|
|
value: GRAY
|
|
},
|
|
showConfirmButton: {
|
|
type: Boolean,
|
|
value: true
|
|
},
|
|
overlay: {
|
|
type: Boolean,
|
|
value: true
|
|
},
|
|
transition: {
|
|
type: String,
|
|
value: 'scale'
|
|
}
|
|
},
|
|
data: {
|
|
loading: {
|
|
confirm: false,
|
|
cancel: false
|
|
}
|
|
},
|
|
watch: {
|
|
show(show) {
|
|
!show && this.stopLoading();
|
|
}
|
|
},
|
|
methods: {
|
|
onConfirm() {
|
|
this.handleAction('confirm');
|
|
},
|
|
onCancel() {
|
|
this.handleAction('cancel');
|
|
},
|
|
onClickOverlay() {
|
|
this.onClose('overlay');
|
|
},
|
|
handleAction(action) {
|
|
if (this.data.asyncClose) {
|
|
this.setData({
|
|
[`loading.${action}`]: true
|
|
});
|
|
}
|
|
this.onClose(action);
|
|
},
|
|
close() {
|
|
this.setData({
|
|
show: false
|
|
});
|
|
},
|
|
stopLoading() {
|
|
this.setData({
|
|
loading: {
|
|
confirm: false,
|
|
cancel: false
|
|
}
|
|
});
|
|
},
|
|
onClose(action) {
|
|
if (!this.data.asyncClose) {
|
|
this.close();
|
|
}
|
|
this.$emit('close', action);
|
|
// 把 dialog 实例传递出去,可以通过 stopLoading() 在外部关闭按钮的 loading
|
|
this.$emit(action, { dialog: this });
|
|
const callback = this.data[action === 'confirm' ? 'onConfirm' : 'onCancel'];
|
|
if (callback) {
|
|
callback(this);
|
|
}
|
|
},
|
|
setWidthWithUnit(val) {
|
|
this.setData({
|
|
widthWithUnit: addUnit(val)
|
|
});
|
|
}
|
|
}
|
|
});
|