<template>
|
<div class="vol-dialog">
|
|
<el-dialog v-model="vmodel" :close-on-click-modal="false" :close-on-press-escape="false" :width="width"
|
:fullscreen="fullscreen" :draggable="draggable" :modal="modal" :before-close="handleClose">
|
<template #header>
|
<i :class="icon"></i> {{ title }}
|
<button class="el-dialog__headerbtn" type="button" style="right: 35px; color: var(--el-color-info)" @click="handleFullScreen">
|
<i class="el-icon el-icon-full-screen"></i>
|
</button>
|
</template>
|
<el-scrollbar :max-height="contentHeight">
|
<div v-if="inited" style="min-height: 50px;" class="srcoll-content" :style="{ padding: padding + 'px' }">
|
<slot name="content"></slot>
|
<slot></slot>
|
</div>
|
</el-scrollbar>
|
<template #footer>
|
<div class="dia-footer" v-if="footer">
|
<slot name="footer"></slot>
|
<el-button type="primary" v-if="!footer" size="mini" @click="handleClose()"><i
|
class="el-icon-close"></i>关闭</el-button>
|
</div>
|
</template>
|
</el-dialog>
|
</div>
|
</template>
|
|
<script>
|
import { defineComponent, ref, watch, watchEffect } from 'vue';
|
|
export default defineComponent({
|
props: {
|
modelValue: false,
|
lazy: {
|
//是否开启懒加载2020.12.06
|
type: Boolean,
|
default: false,
|
},
|
icon: {
|
type: String,
|
default: "el-icon-warning-outline",
|
},
|
title: {
|
type: String,
|
default: "基本信息",
|
},
|
height: {
|
type: Number,
|
default: 200,
|
},
|
width: {
|
type: Number,
|
default: 650,
|
},
|
padding: {
|
type: Number,
|
default: 16,
|
},
|
modal: {
|
//是否需要遮罩层
|
type: Boolean,
|
default: true,
|
},
|
draggable: {
|
//启用可拖拽功能
|
type: Boolean,
|
default: false,
|
},
|
mask: {
|
type: Boolean,
|
default: true,
|
},
|
onModelClose: {
|
//2021.07.11增加弹出框关闭事件
|
type: Function,
|
default: (iconClick) => {
|
return true;
|
}
|
},
|
footer:{ //是否显示底部按钮
|
type: Boolean,
|
default: true
|
}
|
|
},
|
setup(props, context) {
|
const clientHeight = document.body.clientHeight * 0.95 - 60;
|
const inited = ref(true);
|
const vmodel = ref(false);
|
const footer = ref(false);
|
const top = ref(100);
|
vmodel.value = props.modelValue;
|
footer.value = !!context.slots.footer;
|
const contentHeight = ref(200);
|
contentHeight.value = props.height;
|
const handleClose = (done, iconClose) => {
|
let result = props.onModelClose(!!iconClose);
|
if (result === false) return;
|
vmodel.value = false;
|
context.emit("update:modelValue", false);
|
done && done();
|
};
|
const calcHeight = (val) => {
|
// if (props.height > clientHeight) {
|
// if(true){
|
contentHeight.value = clientHeight - 30;
|
return clientHeight / -2 + 'px';
|
// }
|
// contentHeight.value = val || props.height;
|
// return (props.height + 56) / -2 + 'px';
|
};
|
top.value = calcHeight();
|
watch(
|
() => props.modelValue,
|
(newVal, oldVal) => {
|
vmodel.value = newVal;
|
}
|
);
|
watch(
|
() => props.height,
|
(newVal, oldVal) => {
|
top.value = calcHeight();
|
}
|
);
|
const fullscreen=ref(false);
|
const handleFullScreen=()=> {
|
fullscreen.value = !fullscreen.value;
|
context.emit("fullscreen", fullscreen.value);
|
}
|
return {
|
handleClose,
|
inited,
|
vmodel,
|
footer,
|
top,
|
calcHeight,
|
contentHeight,
|
fullscreen,
|
handleFullScreen
|
};
|
}
|
});
|
</script>
|
|
<style lang="less" scoped>
|
.dia-footer {
|
text-align: right;
|
width: 100%;
|
border-top: 1px solid #e2e2e2;
|
text-align: right;
|
padding: 6px 8px;
|
}
|
</style>
|
|
<style scoped lang="less">
|
.vol-dialog ::v-deep(.el-overlay-dialog) {
|
display: flex !important;
|
}
|
|
.vol-dialog ::v-deep(.el-dialog) {
|
margin: auto;
|
}
|
|
.vol-dialog ::v-deep(.el-dialog) {
|
border-top-left-radius: 4px;
|
border-top-right-radius: 4px;
|
}
|
|
.vol-dialog ::v-deep(.el-dialog__header) {
|
border-top-left-radius: 4px;
|
border-top-right-radius: 4px;
|
padding: 0px 13px;
|
line-height: 53px;
|
border-bottom: 1px solid #e6e6e6;
|
height: 50px;
|
color: rgb(79, 79, 79);
|
font-weight: bold;
|
font-size: 14px;
|
margin: 0;
|
// background-image: linear-gradient(135deg, #0cd7bd 10%, #50c3f7);
|
}
|
|
.vol-dialog ::v-deep(.el-dialog__footer),
|
.vol-dialog ::v-deep(.el-dialog__body) {
|
padding: 0;
|
}
|
|
.vol-dialog ::v-deep(.el-dialog__headerbtn) {
|
top: 0;
|
padding-top: 8px;
|
height: 50px;
|
width: 0;
|
padding-right: 30px;
|
padding-left: 5px;
|
}
|
.vol-dialog ::v-deep(.el-dialog) {
|
padding: 0;
|
}
|
</style>
|