分享一个vue3,或者2中使用element-ui的el-dialog的封装例子😃😃

公孙胜
• 阅读 680

el-dialog是使用率很高的组件

使用el-dialog很多都是按照文档的例子,用一个变量控制是否显示,再来一个变量控制标题。

如果我这个对话框多个地方使用的话还要创建多个变量,甚至关闭之后还要清空一些变量,应该可以简化一点。我写vue的时候奉行的都是数据驱动,像刚才那种写法没有问题,也更灵活,反正都是数据驱动的,即使错误了也只是某些地方没正确处理数据而已。

所以封装也需要保持这些优点,灵活可控。

以下是封装代码

一个.vue文件,表示封装的相应el-dialog代码

<template>
    <el-dialog
        :title="configData.title+configData.afterTitle"
        v-model="configData.open"
        width="700px"
        :close-on-click-modal="false"
        append-to-body
    >
        <div class="edit-data-dialog">
            <h1>
                哈哈哈,代码封装
            </h1>
        </div>
        <template #footer>
            <div class="dialog-footer">
                <el-button @click="configData.open = false">取 消</el-button>
            </div>
        </template>
    </el-dialog>
</template>

<script>
/**
 * 数据修改对话框
 */
import { defineComponent, ref, getCurrentInstance, reactive, nextTick } from 'vue';
import { mergeObjProperty } from '@/common/OtherTools';

export default defineComponent({
    name: 'EditDataDialog',
    emits: ['onSuccess'],
    components: {
    },
    setup(_, { emit }) {
        const configMap = {
            //配置信息,初始化时使用
            open: {
                oldValue: false,
            },
            title: {
                oldValue: 'XX数据',
            },
            afterTitle: {
                oldValue: '',
            },
            isShow: {
                //是否只是展示
                oldValue: false,
            },
        };
        const configData = reactive(initDataByConfig(configData,{},configMap));
        const dataContainer = reactive({
            loading:false,
            form:{},
            list:[],
        });
        /** 初始化数据(外部调用) */
        function initData(show = true, data_ = {}, option = {}) {
            initDataByConfig(configData,option,configMap);
            dataContainer.list = [];
            dataContainer.form = {};
            dataContainer.loading = false;
            configData.open = show;
            nextTick(() => {
                dataContainer.form = data_;
                getDataInfo();
            });
        }
        /** 获取数据列表 */
        function getDataInfo() {
        
        }
        return {
            configData,
            initData,
            dataContainer,
        };
    },
});
</script>

<style lang="scss" scoped>
.edit-data-dialog {
  
}
</style>

一个很简单的例子,不用创建多个变量来控制显示以及标题和各种杂七杂八的状态,全部由外部指定,再由initDataByConfig方法初始化。

以下是initDataByConfig方法的代码

/** 
 * 根据配置信息初始化对象
 * 如果 option 有该属性则使用该属性,没有则初始化
 * configMap example
 *  const configMap = {
        //配置信息,初始化时使用
        open: {
            oldValue: false,
        },
        title: {
            oldValue: '入库',
        },
        afterTitle: {
            oldValue: '',
        },
        isShow: {
            //是否只是展示
            oldValue: false,
        },
    };
 */
export function initDataByConfig(data = {}, configOption = {}, configMap = {}) {
    configOption = configOption || {};
    Object.keys(configMap).forEach(key => {
        //初始化一些配置信息
        if (Object.prototype.hasOwnProperty.call(configOption, key)) {
            data[key] = configOption[key];
        } else {
            if (typeof configMap[key].oldValue == 'function') {
                data[key] = configMap[key].oldValue();
            } else {
                data[key] = configMap[key].oldValue;
            }
        }
    });
    return data;
}

使用的话直接引用然后用ref获取组件实例调用initData方法就行了。

这是我目前对el-dialog使用的简单封装,所有数据皆可外部指定且不用创建多个变量,更灵活可控。

反正就是好用的非常。

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Karen110 Karen110
4年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Stella981 Stella981
3年前
Canvas绘制心电图——改变波幅(JS按钮改变Canvas图片大小)
想了解心电图绘制过程的同学可以查看原先的技术文档,单纯想了解JS放大缩小功能的,认真读懂此片文档。写法很多,不唯一,在这里只举我的例子。首先我们需要在原有的变量定义基础上增加两个变量:之后开始写JS方法:1varmulNum1;//定义增益变量2vari1;//定义判断值变量之后写增益变化方法
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Linux应急响应(四):盖茨木马
0x00前言Linux盖茨木马是一类有着丰富历史,隐藏手法巧妙,网络攻击行为显著的DDoS木马,主要恶意特点是具备了后门程序,DDoS攻击的能力,并且会替换常用的系统文件进行伪装。木马得名于其在变量函数的命名中,大量使用Gates这个单词。分析和清除盖茨木马的过程,可以发现有很多值得去学习和借鉴的地方。0x01应急场景
Stella981 Stella981
3年前
ASMSupport局部变量的实现
局部变量的实现git@osc地址(http://git.oschina.net/wensiqun/asmsupport)在字节码层面,每一个方法都有一个局部变量数组,用来存储当前方法的参数,在方法内声明的变量,如果是非静态方法还要存储当前方法实例的引用this。在我们平时使用java的时候,这个局部变量的大小是在源码编译成class的时候就
Wesley13 Wesley13
3年前
ES6的强大变量声明
ES6是javascript的新特性,今天来说说声明变量过去我们声明变量,都是一个一个声明,现在有了一种新的声明方式,它可以将一个多个变量同时声明,声明后变量同时存在一个集合中,集合的数据类型是对象(object)。使用这种声明方式,可以使我们书写程序的过程中思路更加清晰,可以将同一事件下的所有变量集合起来,可以将相同意义的变量集合起来。这样的变量声
Wesley13 Wesley13
3年前
PHP中的NOW()函数
是否有一个PHP函数以与MySQL函数NOW()相同的格式返回日期和时间?我知道如何使用date()做到这一点,但是我问是否有一个仅用于此的函数。例如,返回:2009120100:00:001楼使用此功能:functiongetDatetimeNow(){