elementui自定义对话框弹窗

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

我们可以在插件中加入第三种状态"警告",并修改 CustomDialog.vue 以支持三种状态。

创建一个插件 dialogPlugin.js

javascript 复制代码
import { createApp, h, reactive } from 'vue';
import CustomDialog from './components/CustomDialog.vue';


const DialogPlugin = {
  install(app) {
    const dialogData = reactive({
      isVisible: false,
      message: '',
      type: 'success',
    });


    const mountNode = document.createElement('div');
    document.body.appendChild(mountNode);


    const dialogApp = createApp({
      render() {
        return h(CustomDialog, {
          visible: dialogData.isVisible,
          message: dialogData.message,
          type: dialogData.type,
          'onUpdate:visible': (value) => {
            dialogData.isVisible = value;
          },
        });
      },
    });


    dialogApp.mount(mountNode);


    app.config.globalProperties.$dialog = {
      showSuccess(message) {
        dialogData.message = message;
        dialogData.type = 'success';
        dialogData.isVisible = true;
      },
      showError(message) {
        dialogData.message = message;
        dialogData.type = 'error';
        dialogData.isVisible = true;
      },
      showWarning(message) {
        dialogData.message = message;
        dialogData.type = 'warning';
        dialogData.isVisible = true;
      },
    };
  },
};


export default DialogPlugin;

修改 CustomDialog.vue 以支持三种类型

javascript 复制代码
<template>
  <el-dialog
    v-model="isVisible"
    :show-close="false"
    width="30%"
    draggable
    :close-on-click-modal="false"
    @close="handleClose"
  >
    <template #header="{ close }">
      <div class="visitorDialog">
        <span class="titleClass">提示消息</span>
        <el-icon class="el-icon--left" @click="close">
          <Close color="white" />
        </el-icon>
      </div>
    </template>
    <div class="" style="padding-top: .62rem;">
      <div class="qrCodeImg" :class="messageType" @click="handleClose">
        {{ message }}
      </div>
    </div>
  </el-dialog>
</template>


<script>
import { ElIcon } from 'element-plus';
import { Close } from '@element-plus/icons-vue';


export default {
  components: {
    ElIcon,
    Close,
  },
  props: {
    visible: {
      type: Boolean,
      default: false,
    },
    message: {
      type: String,
      default: '',
    },
    type: {
      type: String,
      default: 'success',
    },
  },
  data() {
    return {
      isVisible: this.visible,
    };
  },
  computed: {
    messageType() {
      return {
        success: 'successClass',
        error: 'errorClass',
        warning: 'warningClass',
      }[this.type] || 'successClass';
    },
  },
  watch: {
    visible(newVal) {
      this.isVisible = newVal;
    },
    isVisible(newVal) {
      this.$emit('update:visible', newVal);
    },
  },
  methods: {
    handleClose() {
      this.isVisible = false;
    },
  },
};
</script>


<style>
.visitorDialog {
  display: flex;
  justify-content: space-between;
  align-items: center;
}


.titleClass {
  font-size: 18px;
  font-weight: bold;
}


.qrCodeImg {
  cursor: pointer;
  text-align: center;
  font-size: 16px;
}


.successClass {
  color: green;
}


.errorClass {
  color: red;
}


.warningClass {
  color: orange;
}
</style>

在 main.js 中注册插件

javascript 复制代码
import { createApp } from 'vue';
import App from './App.vue';
import DialogPlugin from './plugins/dialogPlugin';

const app = createApp(App);
app.use(DialogPlugin);
app.mount('#app');

在组件中使用插件

vue

javascript 复制代码
<template>
  <div>
    <el-button @click="showSuccessDialog">显示成功消息</el-button>
    <el-button @click="showErrorDialog">显示错误消息</el-button>
    <el-button @click="showWarningDialog">显示警告消息</el-button>
  </div>
</template>


<script>
export default {
  methods: {
    showSuccessDialog() {
      this.$dialog.showSuccess('恭喜你,这是一条成功消息');
    },
    showErrorDialog() {
      this.$dialog.showError('抱歉,这是一条错误消息');
    },
    showWarningDialog() {
      this.$dialog.showWarning('注意,这是一个警告消息');
    },
  },
};
</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。

相关推荐
iCxhust36 分钟前
模型:500kW飞轮 10kV输电线路 油田抽油机 同时考虑无功补偿 统计:全年节电量 结果56万度电
前端·css·css3·电力·飞轮
志尊宝1 小时前
AI原生前端开发(011):Chrome 148+内置Gemini Nano入门
前端·chrome·ai-native
Liu.7741 小时前
uniapp swiper 常见问题及修复
前端·uni-app
u0111026751 小时前
图片生成任务的日志记录与敏感信息取舍
前端·图像处理·算法·ai作画
Eastmount1 小时前
[论文阅读] (54)NDSS26 JSIMPLIFIER:动静态与LLM如何协同完成JavaScript解混淆?
javascript·论文阅读·恶意代码分析·智能体安全·ndss
梦想很大很大2 小时前
重新思考 Workrun:AI 时代,我们还需要手动编排 Workflow 吗?
前端·人工智能·后端
Ai-_Man2 小时前
ChatGPT还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·javascript·人工智能·chatgpt·小程序·ecmascript
小羊没烦恼!2 小时前
深入浅出SQL Server中的死锁
java·开发语言·前端·数据库·后端·spring·c#
Frag0ut2 小时前
Chrome DevTools 2026进阶:AI辅助调试与性能诊断原生实战指南
前端·人工智能·chrome devtools·ai调试·lighthouse性能分析·内存泄漏诊断·css容器查询