Vue3 + Element Plus 改写 ElMessageBox实现自定义按钮效果
作者:山核桃&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 方法参数
| 参数名 | 类型 | 说明 | 示例 |
|---|---|---|---|
| id | String / 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自定义按钮内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
