使用场景:

要求点击数据展示弹窗,弹窗中数据点击显示新的弹窗,里面的弹窗还可以继续点击新的弹窗,可以无限制的嵌套弹窗

为什么不用el-dialog的append-to-body?

原因:因为有些弹窗既是父弹窗又是子弹窗,所以使用的时候会报错,报一个循环嵌套错误

效果图:

可以一直无限制的点击 无限制的嵌套

 代码详情:

第一步:新建一个commonData.js 放到utils文件夹下

封装js方法

commonData.js 文件

import Vue from "vue";
let common = {};
if (window) window.common = common;
/**** 该common对象放置所有的共用方法* common.dialog()是调用弹框的方法*/
common.dialog = function(option) {var m = document.createElement("div");document.getElementsByTagName("body")[0].appendChild(m);var v = "";let template = "";template = `<div class="w680" v-if="show"><el-dialog:title="title":visible.sync="show"width="${option.DialogWidth ? option.DialogWidth : "70%"}"top="${option.Dialogtop ? option.Dialogtop : "15vh"}":class="parentClass":close-on-click-modal="false":close-on-press-escape="false" :before-close="handleClose" @close="close"><child v-on:callback="callback" ref="childrenRef" @closeDialog="closeDialog"></child><span style="display: flex; justify-content: center; align-items: center" slot="footer" class="dialog-footer" v-if='${option.btnShow.show}'><el-button size="small" style="padding: 8px 25px;background: #089d81;color: #fff;border: 1px solid #089d81;" v-if='${option.btnShow.showSubmit}' @click="submit">${option.btnShow.showSubmitText || "确 定"}</el-button><el-button size="small" style="padding: 8px 25px;background: #089d81;color: #fff;border: 1px solid #089d81;" @click="show = false" v-if='${option.btnShow.showCancel}'>${option.btnShow.showCancelText || "取 消"}</el-button></span></el-dialog></div>`;v = new Vue({el: m,data: function() {return {title: option.title,type: option.type,style: option.style,show_close: true,show: true,parentClass: option.parentClass,initData: option.initData,};},template: template,mounted: function() {this.$nextTick(() => {this.$refs.childrenRef.init('你想要传过去的值');});},methods: {closeDialog() {this.show = false;},// 确定按钮submit(){this.$refs.childrenRef.submit('提交')},handleClose(done) {var aa = document.getElementsByClassName("w680")[1];if (!aa) {var bb = document.getElementsByClassName("v-modal")[0];if (bb) {document.getElementsByTagName("body")[0].removeChild(bb);}}if (option.close) {option.close();}done();},close() {var aa = document.getElementsByClassName("w680")[1];if (!aa) {var bb = document.getElementsByClassName("v-modal")[0];if (bb) {document.getElementsByTagName("body")[0].removeChild(bb);}}if (option.close) {option.close();}},callback(result) {if (option._source != null) {option.callback.call(option._source, result);this.show = false;return;}//如果不传type或者type等于close或cancel直接关闭弹框if (!result.type || result.type == "close" || result.type == "cancel") {this.show = false;} else if (result.type == "sure") {//如果type等于sure则调用parent传递过来的回调函this.show = false;if (option.callback) {option.callback(result.data);}}}},components: {child: option.component}});return v;
};export default common;

第二步:创建vue文件

创建文件夹 testDialog 文件夹 根据自己需要创建文件夹(这个是我用于演示的,根据自己项目自行创建就可以)

index.vue文件

html部分

<template><divstyle="width:200px;height:200px;background:#eee;color:#000;"@click="openDialog"class="div">点我开启无限弹窗之旅</div>
</template>

js部分


<script>
import common from "@/utils/commonData.js";
import dialog from "./components/dialog.vue";
export default {data() {return {};},methods: {openDialog() {var obj = {aa: "1"};let option = {title: "我是弹窗0000000000000", //标题initData: obj, // 传过去的值type: "addInspection", //多个不同需求的弹窗可以通过type区分DialogWidth: "60%", //弹窗宽度 默认不写是70%Dialogtop: "3vh", //弹窗距离顶部高度 默认不写是15vhbtnShow: {show: true, //是否展示按钮showSubmit: true, //是否展示确定按钮// showSubmitText: "", //确定按钮文字替换(非必填项,可写可不写 不写默认是确定)showCancel: true //是否展示取消按钮// showCancelText: "" //取消按钮文字替换((非必填项,可写可不写 不写默认是取消)},parentClass: "addInspection", //class名component: dialog // 组件};common.dialog(option);}}
};
</script>

css部分

<style>
.div {display: flex;align-items: center;cursor: pointer;justify-content: center;position: fixed;left: calc(50% - 100px);top: 30%;
}
</style>

dialog.vue 文件

html部分

<template><div class="dialogDiv" @click="openDialog">我是弹窗000000000000000000</div>
</template>

js部分

<script>
import dialogOne from './dialogOne.vue'
export default {data() {return {property: "value"};},methods: {init(data, dataOne, dataTwo) {console.log(data, dataOne, dataTwo);},openDialog() {var obj = {aa: "1"};let option = {title: "我是弹窗11111111111111111111", //标题initData: obj, // 传过去的值type: "addInspection", //多个不同需求的弹窗可以通过type区分DialogWidth: "60%", //弹窗宽度 默认不写是70%Dialogtop: "3vh", //弹窗距离顶部高度 默认不写是15vhbtnShow: {show: true, //是否展示按钮showSubmit: true, //是否展示确定按钮// showSubmitText: "", //确定按钮文字替换(非必填项,可写可不写 不写默认是确定)showCancel: true //是否展示取消按钮// showCancelText: "" //取消按钮文字替换((非必填项,可写可不写 不写默认是取消)},parentClass: "addInspection", //class名component: dialogOne // 组件};common.dialog(option);},submit() {this.$emit("closeDialog");}}
};
</script>

css部分


<style lang="scss">
.dialogDiv {width: 200px;height: 200px;background: #000;color: #fff;
}
.el-dialog__header {padding: 10px 20px 10px;background-color: #19a199;
}
.el-dialog__header .el-dialog__title {font-size: 15px;color: #ffffff;font-weight: 700;
}
.el-icon-close:before {color: #fff;
}
.el-dialog__body {padding: 10px 20px;height: 50vh;
}
.el-dialog__headerbtn {top: 15px;
}
// 可以自己去写样式
// .dialog-footer {
//   .el-button {
//     padding: 8px 25px !important;
//     background: #089d81;
//     color: #fff;
//     border: 1px solid #089d81;
//   }
// }
// .el-dialog__body {
//   padding-top: 10px;
//   height: 50vh;
//   overflow-y: auto;
// }
// .el-dialog__headerbtn .el-dialog__close {
//   color: #fff;
// }
</style>

剩下两个文件按照这个自行创建即可 想无限制循环 最后一个文件的弹窗写到第一个 就可以无限制嵌套!

开发不易,喜欢的点个关注,点个赞,谢谢!

vue el-dialog 实现弹窗无限嵌套(点击弹窗弹出新的弹窗,可以一直点击)相关推荐

  1. html弹窗页面控制大小,使用JS弹出新窗口,并设置窗口的大小和位置等相关属性,传递参数...

    使用JS弹出新窗口,同时向弹出的页面传递一个参数. 首先,使用JS获取需要传递的参数.然后将参数传入心得页面. window.open 弹出新窗口的命令: page.html 弹出新窗口的文件名: n ...

  2. vue通过点击按钮弹出新窗口打开html文件

    //1 使用window.open()跳转window.open('excel.html') // 2,a标签跳转踩坑:<a href="excel" tarrget=&qu ...

  3. html 弹窗之后页面变灰色,html点击按钮弹出窗口背景灰掉,点击背景变白退出点击退出也可以...

    html点击按钮弹出窗口背景灰掉,点击背景变白退出点击退出也可以 2011-06-10 18:22阅读: 孑孓 努力搬砖,养老婆孩子. 关注 function showid(idname){ var ...

  4. 自动弹窗被拦截 html,解决JS弹出新窗口被浏览器阻止的解决方案

    本文转载自:http://blog.csdn.net/cntanghai/article/details/6643522 在js中通过open弹出窗口可能会被阻止,我尝试这段代码: var flag ...

  5. android弹窗使用总结,高仿QQ空间操作弹窗

    android弹窗一共有两种方式,一种是dialog及其子类,另一种是popupwindow:Dialog及其子类尤其AlertDialog是最常用的,也是最自由的一种. **Popupwindow与 ...

  6. vue 使用高德地图给海量点标记,并点击标记弹出信息窗口,信息窗口绑定点击事件

    目录 一.需求 二.引入高德地图 2.1.将高德地图引入到项目中 2.2.查看官网快速上手,熟悉高德地图的主要API 2.3.海量点标注要用到的API文档 2.4.全部代码 其他: 一.需求 因为不知 ...

  7. ant-design在 vue 抽屉(drawer)里面嵌套弹出框(modal)出现蒙层遮挡弹框问题

    ant-design在 vue 抽屉(drawer)里面嵌套弹出框(modal)出现蒙层遮挡弹框问题 有时候会遇到这种情况,先打开抽屉,然后再抽屉里打开模态窗,出现模态窗被抽屉的的蒙层遮挡 问题: 可 ...

  8. 【精讲】vue组件开发基础、多层嵌套(内含详细注释)、vuecomponent构造函数

    目录 vue组件开发基础 多层嵌套(内含详细注释) vuecomponent构造函数 第一部分:vue组件开发基础 <!--         vue中使用组件的三大步骤:         一 , ...

  9. table无限嵌套table

    需要达到的效果: table无限嵌套,需要达到:长度不确定,列数不固定,表头不一致 关键 ===> 组件自己调用自己,递归调用 在模板中使用name属性值,来调用自己 一.非懒加载 二.懒加载 ...

最新文章

  1. SpringMVC如何实现restful接口
  2. 研究表明:无人驾驶技术减少拥堵加快进程
  3. swift 动态设置UILabel的高度
  4. Json在线格式化站点
  5. C#只允许启动一个WinFrom进程
  6. w ndows8怎么连接网络,(Wndows8.1优化设置全面解析.doc
  7. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170412
  8. 关于“Xshell连接linux(deepin)时提示ssh服务器拒绝了密码,请再试一次”的问题...
  9. HttpDNS功能说明及实现
  10. 难道冬泳都会断子绝孙?
  11. java入门的注意点_Java基础之Integer使用的注意事项及面试题
  12. 嵌入在网页上Flash媒体播放器(1)
  13. 2022年第十三届蓝桥杯题解(全)
  14. 360急速浏览器有道词典屏幕取词问题
  15. VBA-save as xlsm
  16. 网页星号点号密码查看最简方法
  17. iPhone4S、iPod5代、iPad2、iPad3、mini1代完美绕激活工具Sliver发布全新6.0版,支持工厂激活FMI OFF
  18. 请问苹果x是如何建文件夹_苹果xmind怎么建立文件夹
  19. 微信隐藏功能盘点:修复聊天记录
  20. window.open打开子窗口回调父窗口函数

热门文章

  1. 学计算机的演员,南开大学计算机系到演员 张桐回顾“不安分”的青春
  2. 正则表达式、常用的匹配总结
  3. 强哥说Java--Java Scanner 类
  4. 网络游戏运营策略分析
  5. xshell 使用pem文件登录阿里云等远程服务器
  6. 控制算法--1 二值位式控制算法
  7. redis分布式事务锁
  8. 如何提取pcap文件中的TCP流
  9. Win32绘图总结篇(点、直线、折线、贝塞尔曲线、矩形、椭圆、圆弧、弓形、扇形、多边形等)
  10. 离散实验3 集合的基本运算 (编程要求 根据提示,练习集合的基本运算法则)