Vue3 + Element Plus 改写 ElMessageBox实现自定义按钮效果

 更新时间:2026年03月02日 10:59:59   作者:山核桃&17°  
本文基于Vue3和ElementPlus,改写了ElMessageBox组件,实现了一个任务处理确认弹窗,提供「取消」「处理当前任务(ONE)」「处理全部任务(ALL)」三种操作,适配异步接口调用,可直接复制到Vue3项目中复用,感兴趣的朋友跟随小编一起看看吧

一、概述

本文是基于 Vue3 + Element Plus,对 ElMessageBox 组件进行改写实现的任务处理确认弹窗方法。核心功能是触发弹窗,提供「取消」「处理当前任务(ONE)」「处理全部任务(ALL)」三种操作,适配异步接口调用,可直接复制到 Vue3 项目中复用,无需额外开发基础交互,解决 Vue2 向 Vue3 迁移时 ElMessageBox 的适配问题。

二、技术栈与前置要求

2.1 技术栈

  • Vue3:支持 Composition API、<script setup>语法、async/await 异步操作,适配 Vue3 虚拟 DOM 渲染机制;
  • Element Plus:依赖 ElMessageBox(弹窗核心组件)、ElButton(操作按钮)、ElIcon(图标容器)及 Warning 图标组件;
  • Vue3 渲染函数(h 函数):用于动态构建弹窗自定义内容,替代 Vue2 模板写法,适配 Vue3 组件渲染逻辑;
  • 异步接口:依赖 todoApi 接口函数(需返回 Promise),用于提交任务处理请求,完成单个/全部任务的处理逻辑。

2.2 前置要求

  • 项目已集成 Vue3(推荐 3.2+版本),支持 ES6+语法及 async/await 异步操作;
  • Element Plus 已全局注册或按需导入(需确保 ElMessageBox、ElButton、ElIcon、Warning 图标已导入并注册);
  • 已实现 todoApi 接口,支持接收「任务 ID」和「处理类型」两个参数,返回 Promise 对象;
  • 兼容现代浏览器(Chrome、Firefox、Edge 等),支持 Vue3 虚拟 DOM 渲染及 Element Plus 组件渲染;
  • 若使用<script setup>语法,需确保 Vue3 版本支持该语法(3.2+),无需额外 return 即可暴露方法。

三、完整改写代码

以下为 onToDo 方法完整改写代码(Vue3 + Element Plus 适配),可直接复制到 Vue3 组件中使用,无需额外修改(仅需适配项目接口地址):

// 按需导入(未全局注册Element Plus时需添加,全局注册可省略)
// import { ElMessageBox, ElButton, ElIcon } from 'element-plus'
// import { Warning } from '@element-plus/icons-vue'
// import { todoApi } from '@/api/task' // 导入项目实际任务处理接口
/**
 * onToDo 方法(Vue3 + Element Plus ElMessageBox 改写版)
 * 核心功能:触发任务处理确认弹窗,提供取消、处理单个任务、处理全部任务三种操作
 * @param {String/Number} id - 当前任务唯一标识(用于接口区分具体任务)
 */
const onToDo = (id) => {
  // 调用Element Plus ElMessageBox弹窗,改写适配Vue3渲染逻辑
  ElMessageBox({
    title: "提示", // 弹窗标题
    // 弹窗内容:通过h函数动态构建(替代Vue2模板,适配Vue3)
    message: h("div", null, [
      // 警告图标(Element Plus规范:需用ElIcon组件包裹具体图标,区别于Vue2的class调用)
      h(
        ElIcon,
        {
          style:
            "color:#FCBE2D; font-size: 18px !important; margin-right: 10px; display: inline-block;",
        },
        () => h(Warning)
      ),
      // 弹窗提示文本,明确操作选项
      h(
        "span",
        { style: "vertical-align: middle;" },
        "处理当前任务(ONE),处理全部任务(ALL)和取消?"
      ),
      // 自定义操作按钮容器(右对齐,调整与文本的间距)
      h(
        "div",
        {
          style:
            "display: flex; justify-content: flex-end; margin-top: 10px; margin-bottom: -10px;",
        },
        [
          // 取消按钮:仅关闭弹窗,不执行任何业务逻辑
          h(
            ElButton,
            {
              onClick: () => ElMessageBox.close(),
            },
            "取消"
          ),
          // ONE按钮:处理当前单个任务,异步调用接口后关闭弹窗
          h(
            ElButton,
            {
              onClick: async () => {
                await todoApi(id, "ONE"); // 调用接口,传入当前任务ID和处理类型ONE
                ElMessageBox.close(); // 接口调用完成后,关闭弹窗
              },
            },
            "ONE"
          ),
          // ALL按钮:处理与当前任务相关的全部任务,异步调用接口后关闭弹窗
          h(
            ElButton,
            {
              onClick: async () => {
                await todoApi(id, "ALL"); // 调用接口,传入当前任务ID和处理类型ALL
                ElMessageBox.close(); // 接口调用完成后,关闭弹窗
              },
            },
            "ALL"
          ),
        ]
      ),
    ]),
    showCancelButton: false, // 关闭Element Plus默认取消按钮(使用自定义取消按钮)
    showConfirmButton: false, // 关闭Element Plus默认确认按钮(使用自定义操作按钮)
    callback: () => {}, // 必传空回调,避免Element Plus抛出异常,确保弹窗正常显示
  });
};

四、核心说明

4.1 方法参数

参数名类型说明示例
idString / Number当前触发任务的唯一标识,传入todoApi接口,用于后端区分具体需要处理的任务“task_123”、456

4.2 弹窗核心配置(改写重点)

  • message:通过 Vue3 h 函数动态构建弹窗内容,替代 Vue2 的模板写法,适配 Vue3 虚拟 DOM 渲染机制,可灵活组合图标、文本、按钮;
  • 图标渲染:Element Plus 与 Vue2 Element UI 的核心区别之一,需用 ElIcon 组件包裹 Warning 图标,不可直接使用 class 类名调用图标;
  • 自定义按钮:关闭 Element Plus 默认的确认/取消按钮,通过 h 函数构建三个自定义操作按钮,分别绑定取消、处理单个、处理全部的逻辑;
  • callback:必传空回调函数,Element Plus 的 ElMessageBox 组件在 Vue3 环境下,若不传入 callback 会抛出异常,导致弹窗无法正常显示,空回调不影响任何业务逻辑。

4.3 按钮操作逻辑

  • 取消:仅调用 ElMessageBox.close() 方法关闭弹窗,不执行任何接口调用,不影响当前任务状态;
  • ONE:异步调用 todoApi(id, 'ONE'),仅处理当前传入 id 对应的单个任务,接口调用成功(或完成)后,关闭弹窗;
  • ALL:异步调用 todoApi(id, 'ALL'),处理与当前传入 id 任务相关的全部任务(具体关联逻辑由后端接口实现),接口完成后关闭弹窗。

五、使用方法

5.1 方法调用

在 Vue3 组件中(支持<script setup>或 Options API 两种写法),通过点击事件调用 onToDo 方法,传入任务 id 即可触发弹窗:

// 示例1:<script setup>语法(Vue3.2+ 推荐,简洁高效)
// 按需导入所需组件和接口(全局注册可省略导入)
import { ElMessageBox, ElButton, ElIcon } from "element-plus";
import { Warning } from "@element-plus/icons-vue";
import { todoApi } from "@/api/task";
// 定义onToDo方法(完整代码同上)
const onToDo = (id) => {
  /* 方法实现 */
};
// 表格操作列调用(最常用场景)
// <el-table :data="taskList">
//   <el-table-column label="操作" align="center">
//     <template #default="scope">
//       <el-button type="primary" @click="onToDo(scope.row.id)">处理任务</el-button>
//     </template>
//   </el-table-column>
// </el-table>
// 示例2:Options API(兼容旧写法,适配Vue3)
export default {
  methods: {
    // 定义onToDo方法(完整代码同上)
    onToDo(id) {
      /* 方法实现 */
    },
    // 其他方法中调用
    handleTaskClick(id) {
      // 可添加前置业务逻辑(如任务状态判断)
      this.onToDo(id); // 调用弹窗方法
    },
  },
};

五、注意事项(改写重点)

  • 组件导入:未全局注册 Element Plus 时,必须按需导入 ElMessageBox、ElButton、ElIcon 及 Warning 图标,否则组件无法渲染,弹窗无法显示;
  • 图标渲染:严格遵循 Element Plus 规范,用 ElIcon 包裹 Warning 图标,否则图标无法正常显示(这是 Vue3 改写与 Vue2 写法的核心区别);
  • 异步操作:ONE/ALL 按钮的接口调用必须添加 async/await,确保接口调用完成后再关闭弹窗,避免出现“弹窗已关闭但接口未完成”的异常;
  • 空回调:必须传入 callback: () => {} 空回调,否则 Element Plus 会抛出异常,导致弹窗无法正常渲染;
  • 样式调整:可通过修改 h 函数中的 style 属性,调整弹窗文本、图标、按钮的颜色、尺寸、间距,适配项目 UI 风格;
  • 参数校验:调用 onToDo 方法时,必须传入有效的任务 id(唯一标识),否则接口无法区分任务,导致处理异常;
  • 语法兼容:确保 Vue3 项目支持 ES6+语法,async/await 需在支持 Promise 的环境下使用,避免语法报错;
  • 接口异常:可在 async/await 中添加 try/catch 捕获接口异常,优化用户体验(如弹窗提示接口失败,不关闭弹窗)。

六、常见问题

  • 弹窗不显示:优先检查 Element Plus 组件是否导入、callback 是否传入空回调、h 函数语法是否正确(如组件名称大小写、参数格式);
  • 图标不显示:检查 ElIcon 和 Warning 图标是否导入,是否用 ElIcon 组件包裹 Warning,避免直接使用 class 类名调用;
  • 按钮无反应:检查 todoApi 接口是否导入、接口调用是否添加 async/await、按钮 onClick 事件是否正确绑定;
  • 控制台报错:优先检查 callback 是否为空回调、组件导入是否完整、h 函数中组件名称是否正确(如 ElButton 首字母大写);
  • 接口调用失败:检查接口地址是否正确、参数传递是否与后端一致(如 taskId、handleType 字段名称)、请求方式是否匹配;
  • <script setup>中方法无法调用:确保方法直接定义,无需额外 return,组件和接口导入正确。

到此这篇关于Vue3 + Element Plus 改写 ElMessageBox实现自定义按钮效果的文章就介绍到这了,更多相关vue element plus改写ElMessageBox自定义按钮内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Element封装一个表格组件tableList的使用方法

    基于Element封装一个表格组件tableList的使用方法

    这篇文章主要介绍了基于Element封装一个表格组件tableList的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Node.js path模块,获取文件后缀名操作

    Node.js path模块,获取文件后缀名操作

    这篇文章主要介绍了Node.js path模块,获取文件后缀名操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • vue+element实现打印页面功能

    vue+element实现打印页面功能

    这篇文章主要介绍了vue+element实现打印页面功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-05-05
  • vue源码解读子节点优化更新

    vue源码解读子节点优化更新

    这篇文章主要为大家介绍了vue源码解读子节点优化更新示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • vue 组件开发原理与实现方法详解

    vue 组件开发原理与实现方法详解

    这篇文章主要介绍了vue 组件开发原理与实现方法,结合实例形式详细分析了vue.js组件开发的原理与实现方法,需要的朋友可以参考下
    2019-11-11
  • vue3 Element-Plus el-backtop无效问题及解决

    vue3 Element-Plus el-backtop无效问题及解决

    这篇文章主要介绍了vue3 Element-Plus el-backtop无效问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Vue如何指定不编译的文件夹和favicon.ico

    Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue.js中的计算属性、监视属性与生命周期详解

    Vue.js中的计算属性、监视属性与生命周期详解

    最近在学习vue,学习中遇到了一些感觉挺重要的知识点,感觉有必要整理下来,这篇文章主要给大家介绍了关于Vue.js中计算属性、监视属性与生命周期的相关资料,需要的朋友可以参考下
    2021-06-06
  • vue引入swiper插件的使用实例

    vue引入swiper插件的使用实例

    本篇文章主要介绍了vue引入swiper插件的使用实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Vue3 插槽使用汇总

    Vue3 插槽使用汇总

    这篇文章主要给大家分享了Vue3的 插槽使用汇总,在 2.6.0中,vue 为具名插槽和作用于插槽引入了一个新的统一语法:v-slot。它取代了 slot 和 slot-scope 在新版中的应用,下面就一起来看看文章的详细内容吧
    2021-12-12

最新评论