美文网首页Web前端之路
Element-UI多模态框改造(支持层级嵌套)

Element-UI多模态框改造(支持层级嵌套)

作者: Jkanon | 来源:发表于2020-03-04 14:06 被阅读0次

作为一个后台管理系统,对多页签的支持必不可少,之前我对ElementUI的弹窗样式稍加改造,配合上append-to-body相关属性,使对话框能够内嵌到各个页签之中。当我以为大功告成暗中窃喜之时,拿起鼠标噼里啪啦一阵狂点,才发现自己还是太天真,果然我们只是从一个坑跳到了另外一个坑(见下方的动态图)。为了理想中的康庄大道,这场填坑之旅势在必行

对话框内嵌在各页面之中 在页签之间打开多个弹窗进行切换时没有达到预期效果

0x01 坑从哪里来

要想解决问题,我们必须得知道问题的根源所在,才能一劳永逸。而途径只有一个,那就是阅读源码。通过源码,我们知道了弹框的遮罩层是由一个名为popupmixin混入工具类进行操作的,而popup的核心在于PopupManager这个对象。其中关键部分截图如下:

dialog/src/component.vue popup/index.js popup/popup-manager.js
popup/popup-manager.js popup/popup-manager.js

原来,Dialog组件在全局只维护一个遮罩层DOM节点,然后在关闭当前遮罩层的时候通过堆栈恢复上一个遮罩层位置。以截图为例,当我们打开第二个页签的弹窗时其实是把第一个弹窗的遮罩层给强行征用了,所以当我们切换回第一个页签时,背景就莫名的消失了。当我们关闭第二个弹窗时,堆栈恢复了上一个弹窗的位置所以我们造成了弹窗未关闭的假象。显然,这种节省资源的做法在多页签及弹窗内嵌的需求下必定是先天不足,分身乏术。

0x02 填坑思路

理清了症结我们对症下药即可,而药方也很简单,就是舍得下本,给每个弹窗分配一个遮罩。
其实通过上述截图我们就可以发现,遮罩都是由PopupManager进行管理的,因此我们只需修改PopupManager的源码即可,总结起来就是对其中的getModalmodalStack进行改造,使其能够根据不同的对话框(每个对话框都维护着一个不同的id,可由此区分)对不同的遮罩层进行操作。具体实现再次不再多说。
这里有个难点在于对esc键的响应,由于对于按键的监听操作是在整个文档,无法与单个遮罩进行关联处理(当然了,如果只需要对遮罩范围内进行监听,那对每个遮罩都绑定一个监听事件也未尝不可,这个问题自然也就不存在了)。在此的思路是遍历所有的遮罩节点,取出在当前界面上可视的并且zIndex最高的一个遮罩进行处理,在此我们借助于window.getComputedStyle的力量来判断对应遮罩是否是我们想要关闭的。

0x03 填坑方法

现在我们已经有了填坑的思路,但是要怎么填,把这个思路付诸实践还是值得思考的,这里提供三种方法:

  • 对Element库进行修改替换。即到github上下载最新的官方库进行修改,然后编译打包,对项目的依赖改成本地编译后的库即可
    缺点:动作太大,不利更新
  • 局部替换。增对我们需要修改的组件进行局部覆盖替换。以dialog组件为例,将dialog组件的源码copy到项目目录下,对其中的Popup的引用替换成我们修改后的popup工具类即可
    缺点:得对所有用到遮罩的组件(包括Drawer,Message等)进行替换,否则官方的遮罩和自定义的遮罩同时使用冲突造成zIndex不正常的情况
  • 直接对popup-manager的行为进行覆盖
    这种是我比较青睐的方式,修改粒度也比较小。思路是在自定义的PopupManager中引入(import)官方组件的PopupManager,然后对其默认行为(函数)进行覆盖重写。

相关文章

  • Element-UI多模态框改造(支持层级嵌套)

    作为一个后台管理系统,对多页签的支持必不可少,之前我对ElementUI的弹窗样式稍加改造,配合上append-t...

  • element-ui dialog组件嵌套bug

    模态框嵌套模态框 只需在子集的模态框里面添加append-to-body 就可以了 父级模框 子集模态框 我这样嵌...

  • bootstrap多层或者多个模态框滚动条使页面抖动问题

      在使用Bootstrap中模态框过程中,如果出现多层嵌套的时候,如打开模态框A,然后在A中打开模态框B;或者打...

  • element ui el-dialog弹框坑

    使用el-dialog弹框是不要嵌套使用,可以平级,嵌套使用会出现上面的问题,关闭一个弹窗,模态框依旧存在解决办法...

  • vue组件嵌套(模态框)

    在vue中父组件向自子组件传递props; 子组件向父组件传递属性是用$emit(发布订阅); 实例基本逻辑:点击...

  • 第十三节 MFC的一些概念

    一、模态对话框和非模态对话框Windows对话框分为两类:模态对话框和非模态对话框。模态对话框是这样的对话框,当它...

  • 进阶任务10-事件应用

    实现Tab切换的功能 实现下图的模态框功能,点击模态框不隐藏,点击关闭以及模态框以外的区域模态框隐藏

  • Android:性能优化!!!

    布局优化 核心思想:减少布局的层级 优化方式: 多嵌套情况可以使用RelativeLayout减少嵌套。 布局层级...

  • bootstrap模态框多层嵌套,背景滚动

    问题:在弹出模态框A的基础上,弹出模态框B,关闭模态框B之后,模态框A不能滚动(由于A模块框内容) 造成的原因:遮...

  • 事件的应用

    1. 实现如下图Tab切换的功能 2. 实现下图的模态框功能,点击模态框不隐藏,点击关闭以及模态框以外的区域模态框隐藏

网友评论

    本文标题:Element-UI多模态框改造(支持层级嵌套)

    本文链接:https://www.haomeiwen.com/subject/bdullhtx.html