element-ui的el-dialog,简单的封装。

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

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

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

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

以下是封装代码

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

javascript 复制代码
<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方法的代码

javascript 复制代码
/** 
 * 根据配置信息初始化对象
 * 如果 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使用的简单封装,所有数据皆可外部指定且不用创建多个变量,更灵活可控。

反正就是好用的非常。

有些封装不仅仅是模块分离,还有代码分离,反正就是一句话,代码是先写给人看的,然后才是机器。我奉行的封装是必要才封装,不然是不会去封装的。

文章原文

相关推荐
kyriewen3 小时前
我用 AI 一周写完了整个项目,上线第一天就崩了——这是我踩过最贵的 5 个坑
前端·javascript·ai编程
Larcher3 小时前
AI Loop:让AI像人一样自主完成任务的核心机制
javascript·人工智能·设计模式
默_笙3 小时前
🃏 JS 只有 8 种数据类型,但我花了 2 天才搞懂 null 和 undefined 的区别
javascript
jump_jump4 小时前
流式 HTML:从 htmx 片段装配到浏览器原生增量渲染
javascript·性能优化·前端工程化
swipe5 小时前
正则表达式入门到进阶:从表单校验到手写模板引擎
前端·javascript·面试
kyriewen6 小时前
前端错误监控最全指南:捕获 JS 异常、Promise 拒绝、资源加载失败,附上报代码
前端·javascript·监控
大家的林语冰6 小时前
ESLint 近期动态大全,新版本正式发布,antfu 大佬推荐的插件也更新了!
前端·javascript·前端工程化
胡志辉7 小时前
深入浅出 call、apply、bind
前端·javascript·后端
十九画生10 小时前
parentID ``` JavaScript 是区分大小写的,所以这两个不是同一个字段。 第二,`parent` 没有声明。 应该先写: `
javascript
秃头网友小李10 小时前
前端难点:keep-alive 缓存什么?RouterView 的 key 为什么要带 scopeId?
前端·vue.js