el-dialog鼠标在遮罩层松开会意外关闭,教程图文并茂

报错效果如下

在遮罩层处松开鼠标会导致模态框意外关闭,体验感极差

解决方法

工作流程

  1. 点击遮罩层

    • 用户在对话框遮罩层上点击
  2. 触发 before-close 事件

    • 由于 closeOnClickModal 默认为 true,Element UI 检测到点击遮罩层的行为
    • 在实际关闭对话框前,Element UI 调用 before-close 钩子(在本例中是 beforeDialogClose 方法)
  3. 收集鼠标行为信息

    • 在整个过程中,通过绑定在最外层 div 的 mousedownmouseup 事件收集用户鼠标行为
    • 这些事件记录了用户按下和抬起鼠标时所在元素的 classList
    • 这些信息将被用于在 beforeDialogClose 中做出决策
  4. 拦截器模式

    • before-close 确实就像一个拦截器,类似于 Vue Router 的导航守卫中的 next() 函数
    • 它给开发者提供了一个决定点,可以自定义规则来决定是否继续关闭操作
    • 在这个例子中,只有当鼠标按下和抬起都在同一个元素(遮罩层或关闭按钮)上时,才调用 done() 放行关闭
    • 如果不调用 done(),对话框将保持打开状态

这种实现方式非常巧妙,它增强了用户体验,防止了因为用户在对话框内开始点击然后拖到外部释放鼠标等误操作导致的意外关闭。这是对 Element UI 原有功能的一种优雅扩展。

代码实现

1.图

2.文

js 复制代码
@mousedown.stop="dialogMousedown"
@mouseup.stop="dialogMouseup"

 :before-close="beforeDialogClose"

  mousedownCls: [],
    mouseupCls: [],

    dialogMousedown(e) {
    this.mousedownCls = [...e.target.classList]
    console.log('鼠标按下的元素类名:', this.mousedownCls)
  },
  dialogMouseup(e) {
    this.mouseupCls = [...e.target.classList]
    console.log('鼠标抬起的元素类名:', this.mouseupCls)
  },
  beforeDialogClose(done) {
    const isWrapper =
      this.mousedownCls.includes('el-dialog__wrapper') && this.mouseupCls.includes('el-dialog__wrapper')
    const isClose = this.mousedownCls.includes('el-dialog__close') && this.mouseupCls.includes('el-dialog__close')
    if (isWrapper || isClose) {
      done()
    }
  },

效果展示

相关推荐
2501_9209317012 小时前
React Native鸿蒙跨平台采用ScrollView的horizontal属性实现横向滚动实现特色游戏轮播和分类导航
javascript·react native·react.js·游戏·ecmascript·harmonyos
东东51614 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino14 小时前
图片、文件的预览
前端·javascript
2501_9209317015 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
AI老李16 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
方也_arkling16 小时前
Element Plus主题色定制
javascript·sass
晓晓莺歌16 小时前
vue3某一个路由切换,导致所有路由页面均变成空白页
前端·vue.js
2601_9498095916 小时前
flutter_for_openharmony家庭相册app实战+我的Tab实现
java·javascript·flutter
Up九五小庞16 小时前
开源埋点分析平台 ClkLog 本地部署 + Web JS 埋点测试实战--九五小庞
前端·javascript·开源
摘星编程17 小时前
React Native + OpenHarmony:UniversalLink通用链接
javascript·react native·react.js