/*
* @Description : 对话框混淆
* @Author : XH
* @Date
* @LastEditors
* @LastEditTime
*/
import { dialogForm } from '@/components/dialog';
import _ from 'lodash';
export default {
components: {
dialogForm
},
props: {
// 是否显示
visible: {
type: Boolean,
default: false
},
// 标题
title: {
type: String,
default: '弹窗'
},
// 初始化表单参数
data: {
type: Object,
default: () => ({})
},
// 配置传参,非表单参数
config: {
type: Object,
default: () => ({})
}
},
data() {
return {
// 自定义 可选值:[small/medium/large/custom]
'size': 'medium',
'sizeCustom': {},
// 弹窗配置
'custom-class': 'el-dialog',
'appendToBody': true,
'isFullScreen': false,
'hasScrollbar': true, // 是否有滚动条
'labelWidth': '150px', // 表单的label
'hasFooterSlot': true, // 是否有底部插槽
'hasTablePadding': false, // 表格页弹窗 是否需要table的padding
'titleInfo': '', // 弹窗后的描述
// 表单相关
'modalData': {}, // 表单数据
'modalConfig': {}, // 配置传参
// 内部参数
'defaultModalData': {}, // 记录初始表单数据
'defaultModalConfig': {}, // 配置传参
'pvt_visible': false // 先请求数据再决定是否渲染
}
},
created() {
this.defaultModalData = _.cloneDeep(this.modalData);
this.defaultModalConfig = _.cloneDeep(this.modalConfig);
},
methods: {
/**
* 弹窗打开之前的回调
* !!! 说明:主要针对于请求数据之后再确定是否打开情况
* @return {boolean}
*/
beforeOpenDialog() {
return true;
},
/**
* 弹窗打开动画之后的回调
* 主要解决 打开时获取弹窗内部的 refs
*/
beforeOpenedDialog() {
},
/**
* 弹窗关闭动画之后的回调
*/
beforeClosedDialog() {
},
/**
* 确定的回调事件
*/
comfirmSet() {
console.log(this.modalData);
},
/**************** 分割线 以下方法不可重写 ****************/
/**
* 关闭输入框 自动数据重置
*/
cancelDialogShow() {
this.$emit('update:visible', false);
},
/**
* 触发父组件成功回调
* @param data
*/
emitBtnSuccess(data = {}) {
this.$emit('btnSuccess', data);
},
/**
* 验证正则 确定按钮 无需外部调用
*/
handleConfirmSet() {
if (!this.$refs.modalDataDialog) {
console.warn("el-dialog-form 需添加 ref='modalDataDialog'");
}
this.$refs.modalDataDialog && this.$refs.modalDataDialog.validate((valid) => {
if (valid) {
this.confirmSet();
}
});
},
/**
* 弹窗关闭动画结束时的回调
*/
closed() {
this.beforeClosedDialog();
this.clearUploadFiles();
},
// 通过refs判断 如果是upload组件 则还原上传组件
clearUploadFiles() {
_.forEach(this.$refs, (item) => {
if (item && item.$options.name == 'el-upload') {
item.clearFiles();
}
});
}
},
watch: {
async visible(val) {
if (val) {
this.modalData = _.merge({}, this.defaultModalData, this.data);
this.modalConfig = _.merge({}, this.defaultModalConfig, this.config);
let res = await this.beforeOpenDialog();
if (res) {
this.pvt_visible = true;
} else {
this.cancelDialogShow();
}
} else {
this.pvt_visible = false;
}
}
}
}