AIoT前端公共UI

Dialog.vue 2.6KB

    <!-- * @Author: Devin * @Date: 2022-11-16 10:48:53 * @LastEditors: Devin * @LastEditTime: 2023-02-22 14:51:36 * @Description: 公共抽屉弹窗 --> <template> <el-dialog v-bind="dialogData.drawerData" v-model="drawer" :destroy-on-close="true" custom-class="__common-dialog" :show-close="true" :before-close="handleClose" :width="dialogWidth" :fullscreen="fullscreen" > <slot></slot> <template #footer> <div v-if="dialogData?.btns?.length" class="btns"> <template v-for="(btn, index) in dialogData?.btns" :key="index"> <el-button :type="btn?.type || ''" @click.stop="btn.onClick()"> {{ btn?.label }} </el-button> </template> </div> <template v-else> <el-button @click.stop="closeDialog">关闭并返回</el-button> <el-button type="primary" @click.stop="confirmDialog">提交</el-button> </template> </template> </el-dialog> </template> <script lang="ts" setup> import { ref, onMounted } from 'vue'; const emits = defineEmits(['closeDialog', 'confirmDialog']); const drawer = ref(true); const props = defineProps({ dialogData: { type: Object, default: () => { return { drawerData: {}, btns: [] }; } }, width: { type: String, default: 'middle' }, fullscreen: { type: Boolean, default: () => false } }); const handleClose = () => { drawer.value = false; emits('closeDialog'); }; // 取消 const closeDialog = () => { emits('closeDialog'); }; // 确认 const confirmDialog = () => { emits('confirmDialog'); }; const dialogWidth = ref<any>('middle'); function parseDialog() { const w = props.width; switch (w) { case 'big': dialogWidth.value = '960px'; break; case 'middle': dialogWidth.value = '831px'; break; case 'small': dialogWidth.value = '560px'; break; case 'full': dialogWidth.value = '831px'; break; default: dialogWidth.value = w; break; } } onMounted(() => { parseDialog(); }); </script> <script lang="ts"> export default { name: 'CommonDialog' }; </script> <style lang="scss"> .__common-dialog { max-height: 96vh; } .el-dialog__body { border-bottom: 1px solid #ebebeb !important; border-top: 1px solid #ebebeb !important; max-height: 60vh; min-height: 40vh; overflow-x: hidden; overflow-y: auto; } .el-dialog__header { border-bottom: 1px solid #ebebeb !important; margin-bottom: 0px; padding-bottom: 15px; } .el-dialog__footer { border-top: 1px solid #ebebeb !important; padding-top: 15px; } </style>