elementui自定义对话框弹窗

打印 上一主题 下一主题

主题 818|帖子 818|积分 2454

可以将自定义对话框封装成一个插件,如许你可以在任何地方通过雷同于 this.$dialog 的方式来调用它。以下是一个实现示例:

我们可以在插件中加入第三种状态“告诫”,并修改 CustomDialog.vue 以支持三种状态。
创建一个插件 dialogPlugin.js
  1. import { createApp, h, reactive } from 'vue';
  2. import CustomDialog from './components/CustomDialog.vue';
  3. const DialogPlugin = {
  4.   install(app) {
  5.     const dialogData = reactive({
  6.       isVisible: false,
  7.       message: '',
  8.       type: 'success',
  9.     });
  10.     const mountNode = document.createElement('div');
  11.     document.body.appendChild(mountNode);
  12.     const dialogApp = createApp({
  13.       render() {
  14.         return h(CustomDialog, {
  15.           visible: dialogData.isVisible,
  16.           message: dialogData.message,
  17.           type: dialogData.type,
  18.           'onUpdate:visible': (value) => {
  19.             dialogData.isVisible = value;
  20.           },
  21.         });
  22.       },
  23.     });
  24.     dialogApp.mount(mountNode);
  25.     app.config.globalProperties.$dialog = {
  26.       showSuccess(message) {
  27.         dialogData.message = message;
  28.         dialogData.type = 'success';
  29.         dialogData.isVisible = true;
  30.       },
  31.       showError(message) {
  32.         dialogData.message = message;
  33.         dialogData.type = 'error';
  34.         dialogData.isVisible = true;
  35.       },
  36.       showWarning(message) {
  37.         dialogData.message = message;
  38.         dialogData.type = 'warning';
  39.         dialogData.isVisible = true;
  40.       },
  41.     };
  42.   },
  43. };
  44. export default DialogPlugin;
复制代码
修改 CustomDialog.vue 以支持三种类型
  1. <template>
  2.   <el-dialog
  3.     v-model="isVisible"
  4.     :show-close="false"
  5.     width="30%"
  6.     draggable
  7.     :close-on-click-modal="false"
  8.     @close="handleClose"
  9.   >
  10.     <template #header="{ close }">
  11.       <div class="visitorDialog">
  12.         <span class="titleClass">提示消息</span>
  13.         <el-icon class="el-icon--left" @click="close">
  14.           <Close color="white" />
  15.         </el-icon>
  16.       </div>
  17.     </template>
  18.     <div class="" style="padding-top: .62rem;">
  19.       <div class="qrCodeImg" :class="messageType" @click="handleClose">
  20.         {{ message }}
  21.       </div>
  22.     </div>
  23.   </el-dialog>
  24. </template>
  25. <script>
  26. import { ElIcon } from 'element-plus';
  27. import { Close } from '@element-plus/icons-vue';
  28. export default {
  29.   components: {
  30.     ElIcon,
  31.     Close,
  32.   },
  33.   props: {
  34.     visible: {
  35.       type: Boolean,
  36.       default: false,
  37.     },
  38.     message: {
  39.       type: String,
  40.       default: '',
  41.     },
  42.     type: {
  43.       type: String,
  44.       default: 'success',
  45.     },
  46.   },
  47.   data() {
  48.     return {
  49.       isVisible: this.visible,
  50.     };
  51.   },
  52.   computed: {
  53.     messageType() {
  54.       return {
  55.         success: 'successClass',
  56.         error: 'errorClass',
  57.         warning: 'warningClass',
  58.       }[this.type] || 'successClass';
  59.     },
  60.   },
  61.   watch: {
  62.     visible(newVal) {
  63.       this.isVisible = newVal;
  64.     },
  65.     isVisible(newVal) {
  66.       this.$emit('update:visible', newVal);
  67.     },
  68.   },
  69.   methods: {
  70.     handleClose() {
  71.       this.isVisible = false;
  72.     },
  73.   },
  74. };
  75. </script>
  76. <style>
  77. .visitorDialog {
  78.   display: flex;
  79.   justify-content: space-between;
  80.   align-items: center;
  81. }
  82. .titleClass {
  83.   font-size: 18px;
  84.   font-weight: bold;
  85. }
  86. .qrCodeImg {
  87.   cursor: pointer;
  88.   text-align: center;
  89.   font-size: 16px;
  90. }
  91. .successClass {
  92.   color: green;
  93. }
  94. .errorClass {
  95.   color: red;
  96. }
  97. .warningClass {
  98.   color: orange;
  99. }
  100. </style>
复制代码
在 main.js 中注册插件
  1. import { createApp } from 'vue';
  2. import App from './App.vue';
  3. import DialogPlugin from './plugins/dialogPlugin';
  4. const app = createApp(App);
  5. app.use(DialogPlugin);
  6. app.mount('#app');
复制代码
在组件中使用插件
vue
  1. <template>
  2.   <div>
  3.     <el-button @click="showSuccessDialog">显示成功消息</el-button>
  4.     <el-button @click="showErrorDialog">显示错误消息</el-button>
  5.     <el-button @click="showWarningDialog">显示警告消息</el-button>
  6.   </div>
  7. </template>
  8. <script>
  9. export default {
  10.   methods: {
  11.     showSuccessDialog() {
  12.       this.$dialog.showSuccess('恭喜你,这是一条成功消息');
  13.     },
  14.     showErrorDialog() {
  15.       this.$dialog.showError('抱歉,这是一条错误消息');
  16.     },
  17.     showWarningDialog() {
  18.       this.$dialog.showWarning('注意,这是一个警告消息');
  19.     },
  20.   },
  21. };
  22. </script>
复制代码
通过这种方式,你可以在任何地方通过 this.                                   d                         i                         a                         l                         o                         g                         .                         s                         h                         o                         w                         S                         u                         c                         c                         e                         s                         s                         、                         t                         h                         i                         s                         .                              dialog.showSuccess、this.                  dialog.showSuccess、this.dialog.showError 和 this.$dialog.showWarning 来显示消息对话框,而无需在每个组件中显式引用 CustomDialog。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表