【前端】解决element-ui两层dialog嵌套,遮罩层消失的问题。

背景

总觉得element-ui dialog的遮罩层逻辑有点晦涩,当一个dialog内嵌另一个dialog时,它的遮罩层却始终只有一个,也就是下方class="v-modal"的div。

可以看到, v-modal的层级总是比dialog低一层。

问题

当两层dialog为直接父子关系时, 我们可以简单的使用其属性append-to-body, modal-append-to-body来解决问题:

  • 如,第二层dialog内容被遮罩层覆盖。
html 复制代码
<el-dialog>
...
	<el-dialog>
	</el-dialog>
</el-dialog>

但是,当两层dialog不是直接父子关系, 你可能会碰到关闭dialog2时,回到dialog1后,遮罩层消失的问题。

推测:

  • 关闭dialog时, 隐藏遮罩层的逻辑是有延迟的,可能(几十毫秒)。
  • 关闭dialog2时,element会为dialog1动态添加一个v-modal的遮罩层。
  • 在特定情况下,上述 逻辑1 会晚于 逻辑2 ., 导致dialog1的遮罩层消失
html 复制代码
<el-dialog ref="dialog1">
...
	<el-tab>
		...
			<el-dialog ref="dialog2">
			</el-dialog>
	<el-tab>
</el-dialog>

解决思路

回到dialog1时, 手动判断 v-modal遮罩层是否存在,没有则添加。

js 复制代码
      // 解决dialog嵌套,从第二层返回后,遮罩层消失的问题
      addModalDivIfNotExists() {
        // 获取dialog的父级div
        const parentDiv = this.$refs.parentDiv;
        // 获取dialog
        const dialog = this.$refs.dialog
        // 检查是否已存在class为"v-modal"的div
        const existingModalDiv = parentDiv.querySelector('.v-modal');
        if (!existingModalDiv) {
          // 如果不存在,则创建一个新的div
          const newModalDiv = document.createElement('div');
          newModalDiv.classList.add('v-modal');
          // 设置z-index
          const parentZIndex = dialog.$el.style.zIndex
          newModalDiv.style.zIndex = Number(parentZIndex) - 1
          // 将新的div添加到父级div中
          parentDiv.appendChild(newModalDiv);
        }
      },

题外话

使用ant design vue的modal时, 似乎没有碰到类似问题

相关推荐
SoaringHeart3 小时前
Flutter最佳实践:IM聊天文字链接自动识别跳转
前端·flutter
掘金一周3 小时前
企业中要做智能体,最佳的方案是什么? | 沸点周刊 6.18
前端·人工智能·ai编程
Darling噜啦啦3 小时前
CSS 3D 变换与 Flex 布局实战:从零打造旋转立方体
前端·css
秃头网友小李4 小时前
前端难点:keep-alive 缓存什么?RouterView 的 key 为什么要带 scopeId?
前端·vue.js
鱼人4 小时前
CSS 变量:一个变量救你一百次复制粘贴
前端
长大19884 小时前
CSS 到底是什么?和 HTML 的区别一次讲清楚
前端
禅思院4 小时前
路由性能优化终极指南:从懒加载漏洞到边缘渲染的架构跃迁
前端·架构·前端框架
怕浪猫4 小时前
Electron 开发实战(十六):总结与展望|生态现状、框架对比、行业趋势与学习指南
前端·javascript·electron
文心快码BaiduComate4 小时前
Comate 搭载GLM-5.2:百万上下文,稳定支撑长程任务
前端·程序员·开源
星栈4 小时前
Dioxus 的 `rsx!` 语法:如果你会 React,上手确实特别快
前端·前端框架