解决ElementPlus对话框el-dialog中关闭事件重复触发问题

问题背景

在使用ElementPlus的el-dialog组件时,发现点击取消按钮会触发两次关闭事件:

  1. 第一次参数为PointerEvent(事件对象)

  2. 第二次参数为undefined

需要确保点击取消按钮时仅触发一次有效关闭事件,并传递正确的布尔值参数。

问题分析(ElementPlus特性相关)

组件结构特征

html 复制代码
<el-dialog
  :modelValue="visible"
  @close="handleClose"> <!-- ElementPlus内置关闭事件 -->
  <template #footer>
    <el-button @click="close">取消</el-button>
  </template>
</el-dialog>

双重触发原因

点击取消按钮:会触发close()关闭函数 → 然后触发对话框的handleClose()函数(内置的@close事件)

针对性解决方案

1. 显式传参阻断事件对象

html 复制代码
<el-button 
  class="footer__button" 
  @click="closeBindingRole(false)"> <!-- 关键修改 -->
  取消
</el-button>

2. 统一对话框关闭处理

html 复制代码
<el-dialog
  :modelValue="bindingRoleVisible"
  @close="handleDialogClose"> <!-- 专用关闭处理 -->
  <!-- 对话框内容 -->
</el-dialog>

<script>
// 统一关闭入口
const handleDialogClose = () => {
  closeBindingRole(false);
};
</script>

3. 增强型状态锁(ElementPlus适配版)

javascript 复制代码
let dialogClosing = false;

const closeBindingRole = (isSuccess: boolean) => {
  if (dialogClosing) return;
  
  dialogClosing = true;
  emit("closeBindingRoleDialog", isSuccess);
  
  // 兼容ElementPlus动画时长
  setTimeout(() => {
    dialogClosing = false;
  }, 300); // 略大于对话框关闭动画时间
};
相关推荐
Larcher32 分钟前
新手也能学会,100行代码玩AI LOGO
前端·llm·html
徐子颐1 小时前
从 Vibe Coding 到 Agent Coding:Cursor 2.0 开启下一代 AI 开发范式
前端
小月鸭1 小时前
如何理解HTML语义化
前端·html
jump6801 小时前
url输入到网页展示会发生什么?
前端
诸葛韩信1 小时前
我们需要了解的Web Workers
前端
brzhang1 小时前
我觉得可以试试 TOON —— 一个为 LLM 而生的极致压缩数据格式
前端·后端·架构
yivifu2 小时前
JavaScript Selection API详解
java·前端·javascript
这儿有一堆花2 小时前
告别 Class 组件:拥抱 React Hooks 带来的函数式新范式
前端·javascript·react.js
十二春秋2 小时前
场景模拟:基础路由配置
前端
六月的可乐2 小时前
实战干货-Vue实现AI聊天助手全流程解析
前端·vue.js·ai编程