可拖拽组件 <BaseDialog v-if="totalDialogVisible" title="合计" :visible.sync="totalDialogVisible" width="30%" @close="handleCloseTotal" @submit="handleCloseTotal" > <!-- <p v-for="(item,index) in currencyData" :key="index" style="color:#DD1931;font-size: 18px; font-weight: bold;"> <span>应付 {{item.currency}} : </span> <span>{{item.totalAmount}}</span> </p> --> <!-- 应收 --> <div v-for="(item,index) in arList" :key="index" style="color:rgb(102, 163, 9); font-size:16px; font-weight:bold"> <p>应收 {{item.currency}} : {{item.totalAmount}} </p> </div> <!-- 应付 --> <div v-for="(item,index) in apList" :key="'flag'+ index" style="color:rgb(221, 25, 49); font-size:16px; font-weight:bold"> <p>应付 {{item.currency}} : {{item.totalAmount}}</p> </div> </BaseDialog> ================================================================================================= main.js中引用:
import BaseDialog from "@/components/BaseDialog"; 在全局挂在一次
Vue.component('BaseDialog', BaseDialog) baseDigLog文件夹 index.vue:
<template> <el-dialog :title="title" :visible.sync="visible" :width="width" :before-close="handleClose" :append-to-body="true" :close-on-click-modal="false" :destroy-on-close="destroyOnClose" :modal="modal" :show-close="showClose" v-dialogDrag="drag" ref="dialogRef" > <div class="center-box"> <slot></slot> </div>
<template v-if="slotFooter"> <slot slot="footer" name="slotFooter"></slot> </template> <template v-else> <span slot="footer" class="dialog-footer" v-if="!hiddenFooter"> <el-button @click="handleClose" v-if="showCancel">{{ cancelText }}</el-button> <el-button type="primary" @click="submit" :loading="loading" v-if="showConfirm" :disabled="confirmDisabled">{{ confirmText }}</el-button> </span> </template> </el-dialog> </template> <script>
export default { props: { visible: false, title: '', width: '', // 是否隐藏footer hiddenFooter: { type: Boolean, default: false }, destroyOnClose: { type: Boolean, default: true }, // 确定后的loading状态 loading: false, // 插槽footer,为true得自己配置footer, name为slotFooter slotFooter: false, // 是否显示确认 showConfirm: { type: Boolean, default: true }, // 是否显示取消 showCancel: { type: Boolean, default: true }, // 是否显示遮罩层 modal: { type: Boolean, default: false }, // 是否显示右上角x showClose: { type: Boolean, default: true }, // 默认的取消按钮文本 cancelText: { type: String, default: '取 消' }, // 默认的确定按钮文本 confirmText: { type: String, default: '确 定' }, // 是否拖拽 drag: { type: Boolean, default: true }, // 确定按钮是否禁用 confirmDisabled: { type: Boolean, default: false } }, data() { return { }; }, created(){ }, beforeDestroy() { this.destory() }, deactivated() { this.destory() }, methods: { handleClose() { this.$emit("close"); }, submit() { this.$emit("submit"); }, destory() { // 没有no-close类名,才执行关闭事件 if (!this.$refs.dialogRef.$el.classList.contains('no-close')) this.handleClose() } }, }; </script>
<style lang="scss" scoped> ::v-deep .el-dialog__footer { text-align: center; clear: both; } </style> =================================================================== example.vue:
<template> <BaseDialog v-if="visible2" :title="title" :visible="visible2" width="1200px" @close="close" @submit="submit" > <div class="content"> <!-- 这里放业务代码 --> </div> </BaseDialog> </template>
<script> // 这是使用BaseDialog组件的例子,可直接复制使用
export default { props: { visible: false, title: { type: String, default: () => 'Title' }, }, data() { return { visible2: this.visible, }; }, created() { }, methods: { close() { this.visible2 = false this.$emit('close') }, submit() { this.close() } }, }; </script> <style scoped lang="scss"> .content { padding: 0 5px 10px; text-align: left; } </style>
totalDialogVisible 是用来判断此组件是否需要显示和隐藏的
handleCloseTotal(){ this.totalDialogVisible = false; }, 用来关闭弹框