千家信息网

vue+el-element中根据文件名动态创建dialog的方法是什么

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章给大家介绍vue+el-element中根据文件名动态创建dialog的方法是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。背景在项目中使用对话框的通常做法是把对话框
千家信息网最后更新 2026年11月01日vue+el-element中根据文件名动态创建dialog的方法是什么

这篇文章给大家介绍vue+el-element中根据文件名动态创建dialog的方法是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

背景

在项目中使用对话框的通常做法是把对话框封装成组件,在使用的地方引入,然后添加到template,使用visible.sync控制对话框的显示/隐藏,监听confirm事件处理用户点击确定。如下:

 

在封装的dialog内部也需要在关闭时更新visible,确定时触发confirm事件:

 methods: {    close() {        this.$emit("update:visible", false);    },    confirm() {        this.close();        this.$emit("confirm");    }}

这样的做法不仅仅导致页面初始化时引入所有对话框组件而影响加载速度,更头疼的是页面中引入了很多对话框时,会导致页面很杂乱:需要为每个对话框插入一段html,为每个对话框维护一个单独的visible变量,为每个对话框添加confirm事件监听...

而这些操作大部分是和业务无关的,且这些操作又是极其相似的。

那么,有没有通过js动态创建dialog的方法呢?

createDialog("confirm-dialog.vue");

就像上面这样根据文件名即可打开对话框,不用定义visible及添加一堆html和事件回调,甚至不需要先引入对话框组件!

是不是很简单!心动了吧?看下去吧。

实现

1.封装的/utils/dialogControl.js

import Vue from 'vue'async function createDialog (fileName, data) {  const dialogsContext = require.context(    '../components', // 定义查找文件的范围    true,    /([a-zA-Z\-0-9]+)\.vue$/, // 定义文件名规则    'lazy'  )  // 查找到传入名字的文件并加载该文件  let match = dialogsContext.keys().find((key) => key.includes(fileName))  if (!match) return  let componentContext = await dialogsContext(match)  let temp = componentContext.default  return new Promise(function (resolve, reject) {    // 初始化配置参数    let opt = {      data    }    let component = Object.assign({}, temp)    let initData = {      visible: true    }    Object.assign(initData, component.data())    opt.data && Object.assign(initData, JSON.parse(JSON.stringify(opt.data)))    component.data = function () {      return initData    }    // 创建构造器创建实例挂载    let DialogC = Vue.extend(component)    let dialog = new DialogC()    // 关闭事件    let _onClose = dialog.$options.methods.onClose    dialog.onClose = function () {      resolve()      dialog.$destroy()      _onClose && _onClose.call(dialog)      document.body.removeChild(dialog.$el)    }    // 回调事件    let _onCallback = dialog.$options.methods.onCallback    dialog.onCallback = function (...arg) {      try {        _onCallback && _onCallback()        resolve(arg)        dialog.$destroy()        _onClose && _onClose.call(dialog)        document.body.removeChild(dialog.$el)      } catch (e) {        console.log(e)      }    }    dialog.$mount()    // 点击关闭按钮时会改变visible    dialog.$watch('visible', function (n, o) {      dialog === false && dialog.onClose()    })    document.body.appendChild(dialog.$el)  })}export { createDialog }

说明:
1.需要指定查找文件的路径及匹配名称的正则表达式,这样能过滤掉一些不需要的文件

2.接收一个fileName参数用于匹配要打开的对话框文件,data参数是传递给对话框的数据,会合并到组件的data中

3.使用visible变量控制对话框的显示/隐藏

4.定义了一个onClose方法用于关闭对话框,对话框中可以使用该方法进行关闭

5.onCallback方法用于向调用对话框的父组件传值,如点击确定按钮时向父组件传值

2.dialog文件定义

如/components/ConfirmDialog.vue,使用visible变量控制显示/隐藏,onClose处理关闭事件,确定按钮的回调是onCallback(和dialogControl.js中的定义一致)。

3.使用

引入dialogControl中的createDialog方法,直接传入文件名称即可打开。

如果有其他的属性,则以键值对的形式放入第二个参数,这些属性会合并到对话框组件的data中,因此对话框组件中可以直接使用这些属性。

createDialog方法得到一个promise对象,其then方法能得到confirm返回的结果。

效果如下:

关于vue+el-element中根据文件名动态创建dialog的方法是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

对话框 对话 文件 方法 组件 事件 文件名 参数 动态 变量 属性 按钮 页面 封装 控制 做法 内容 名称 更多 处理 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技有限公司 蓝思科技飞鸽互联网 科技互联网企业 互联网和科技技术 互联网巨头反垄断金融科技 小马过河互联网科技 未来的互联网科技 广州互联网络科技有限公司 互联网养老 桔豆科技 佰商互联网科技有限公司 温州喔噻互联网科技有限公司 宁夏众和广鑫互联网科技有限公司 黑科技闪耀互联网之光 江阴互联网智能科技产品进口 小米互联网科技园入驻 信承诺互联网科技有限公司 万物互联网智能科技 互联网界的黑科技 科技互联网专业工作会议发言稿 互联网科技创新创业项目 互联网是不是新科技 网络科技有限互联网 火传媒上海互联网科技 中国互联网有什么科技含量 小米互联网科技园设置 宁夏科技产业互联网案例 杭州壁岐互联网科技有限公司 黑科技 体验场景 互联网大会 雨阳互联网卡科技有限公司 版纳互联网科技选哪家
0