文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-22 05:34

关注

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

背景

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

 <confirm-dialog     v-if="confirmDialogVisible"     :title="$t(`mineData.tips.deleteDataset`)"     :visible.sync="confirmDialogVisible"     @confirm="confimHandler" ></confirm-dialog>

 在封装的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.需要指定查找文件的路径及匹配名称的正则表达式,这样能过滤掉一些不需要的文件

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

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

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

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

2.dialog文件定义

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

<template>    <el-dialog title="提示" :visible.sync="visible" width="30%">        <span>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Nesciunt quis            perspiciatis fugiat molestiae provident accusantium repudiandae fugit            minima, eaque, repellat quibusdam iste sed ad? Debitis qui praesentium            minus incidunt esse!</span>        <span slot="footer" class="dialog-footer">            <el-button @click="onClose">取 消</el-button>            <el-button type="primary" @click="onCallback(true)">确 定</el-button>        </span>    </el-dialog></template><script>export default {  data () {    return {}  },  methods: {  }}</script>

 3.使用

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

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

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

<template>  <div>    <h2>This is an show page</h2>    <el-button type="primary" @click="openDialog">打开</el-button>  </div></template><script>import { createDialog } from "@/utils/dialogControl";export default {  methods: {    openDialog() {      let dialog = createDialog("confirm-dialog.vue");      dialog.then((v) => {        if (v) {          console.info("确定");        }      });    },  },};</script>

效果如下:

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

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯