封装动态表单组件

技术栈:vue2+ js + webpack
需求:
利用数据渲染表单,实现代码的精简化及效率的提升。

效果图:
在这里插入图片描述
封装的组件:

  <div v-if="formConfig"><el-formv-bind="$attrs"ref="formDom":model="formData":rules="formRules":inline="inline":label-width="labelWidth":label-position="labelPosition"><el-form-itemv-for="(item, key, index) in formConfig":key="key":label="item.label":label-width="item.labelWidth || '61px'":prop="key":style="item.style"v-if="!item.hide"><!-- 只列出focus blur change事件举例,更多事件可以自行添加绑定 --><el-inputv-bind="$attrs"v-if="item.type === 'input'"v-model="formData[key]":disabled="item.disabled":type="item.inputType ? item.inputType : 'text'":placeholder="item.placeholder || `请输入${item.label}`"clearable@focus="e => issueEvent(e, item.onFocus)"@blur="e => issueEvent(e, item.onBlur)"@change="e => issueEvent(e, item.onChange)"/><el-selectv-if="item.type === 'select'"v-model="formData[key]"clearable:disabled="item.disabled":placeholder="item.placeholder || `请选择${item.label}`":multiple="item.multiple":filterable="item.filterable":max-tag-count="item.max_tag_count"style="width:100%"@change="e => issueEvent(e, item.onChange)"><el-optionv-for="list in item.options":key="list.value":value="list.value":label="list.label"></el-option></el-select><el-cascaderv-if="item.type === 'cascader'"v-model="formData[key]":disabled="item.disabled":options="item.options":show-all-levels="false"style="width:100%":placeholder="item.placeholder || `请输入${item.label}`":props="item.props"@change="e => issueEvent(e, item.onChange)"></el-cascader><el-date-pickerv-if="item.type === 'dateTime'"v-model="formData[key]":picker-options="pickerOptions":type="item.dateType ? item.dateType : 'month'":key="item.dateType ? item.dateType : 'month'":placeholder="item.placeholder || `请选择${item.label}`":value-format="item.format"></el-date-picker><slot name="form" :item="item" :from="formData[key]" /><div><el-buttonv-if="item.type === 'confirm'"type="primary"icon="el-icon-search":loading="item.isSearching"@click="submit">{{ item.text ? item.text : "查询" }}</el-button><el-buttonv-if="item.type === 'reset'"icon="el-icon-refresh"@click="reset">{{ item.text ? item.text : "重置" }}</el-button><el-buttonv-if="item.type === 'export'"class="downloadbtn"@click="handleExport"><svg-icon icon-class="ic_export" class="tablesvgicon"></svg-icon>{{ item.text ? item.text : "导出" }}</el-button><slot name="button" :item="item" /></div></el-form-item></el-form></div>
</template><script>
export default {name: "customForm",props: {// 表单项是否行内显示inline: {type: Boolean,default: true},// 表单项配置formConfig: {type: Object,default: () => {}},// 表单项数据formDataInit: {type: Object,default: () => {}},// 表单标签宽度labelWidth: {type: [Number, String],default: "61"},// 表单标签位置,默认左侧labelPosition: {type: String,default: "left"},// 表单校验规则formRules: {type: Object,default: () => {}}},data() {return {formData: this.formDataInit};},methods: {//重点在issueEvent函数,可以给事件绑定一个空函数避免报错,如果有外部传入的自定义函数则返回这个函数/*组件内函数负责分发表单项事件 */issueEvent(value, mouseEvent) {if (mouseEvent) {return mouseEvent(value);}},submit() {this.$emit("submit");},reset() {this.$refs.formDom.resetFields();this.$emit("reset");},handleExport() {this.$emit("handleExport");}}
};
</script><style lang="scss" scoped>
/deep/ .el-cascader--medium {line-height: 28px;
}
</style>

组件的运用:

<template><div><div class="search-box xl-querybox marginbottom15 borderRadius1 "><!-- 这里是测试页 测试引入组件 --><BaseFrom:formDataInit="formDataInit":form-config="formConfig":form-rules="formRules"@submit="getList"><template #form="{from,item}"><div v-if="item.type === 'tab'"><el-radio-group v-model="from" @change="handleQuery($event, from)"><el-radio-button :label="1">日</el-radio-button><el-radio-button :label="2">月</el-radio-button><el-radio-button :label="3">年</el-radio-button></el-radio-group></div></template><template #button="{item}"><div v-if="item.type === 'button'">12313</div></template></BaseFrom><!-- 新增编辑的表单 --></div><div class="edit-from-style"><BaseFrom:formDataInit="formDataInit":form-config="formConfig2":form-rules="formRules":inline="false"@submit="getList"></BaseFrom></div></div>
</template><script>
import BaseFrom from "@/components/BaseFrom";
import { formatDate_y_m_d } from "@/utils/index";
export default {components: {BaseFrom},data() {return {formConfig2: {id: {label: "id",type: "input",// style: { width: "20%" },placeholder: "看看提示语",labelWidth: "null"},name: {label: "name",type: "input",placeholder: "看看提示语",labelWidth: "null"},ids: {label: "项目id",type: "cascader",style: { width: "100%" },props: {expandTrigger: "hover",children: "childs",label: "label",value: "value"},options: [{ label: "请选择", value: "" },{ label: "技术", value: "技术" },{ label: "生活", value: "生活" },{ label: "其他", value: "其他" }],labelWidth: "null"}},/*----------表格头部的查询表单---------- */isSearching: false, // // 是否查询中// 表单配置formConfig: {id: {label: "id",type: "input",placeholder: "看看提示语"},ids: {label: "项目id",type: "cascader",props: {expandTrigger: "hover",children: "childs",label: "label",value: "value"},options: [{ label: "请选择", value: "" },{ label: "技术", value: "技术" },{ label: "生活", value: "生活" },{ label: "其他", value: "其他" }]},status: {label: "状态",type: "select",// multiple: true, // 是否支持多选max_tag_count: 1, // 多选时最多显示多少个 tagoptions: [{label: "数据一",value: "0"},{label: "数据二",value: "1"}],onChange: (value, label, arr) => {console.log(value, label, arr);if (value == "0") {this.formConfig["id"].disabled = false;} else {this.formConfig["id"].disabled = true;}console.log("this.formDataInit", this.formDataInit);}},tab: {label: "周期",type: "tab",labelWidth: "10"},time: {label: "时间",type: "dateTime"},// time1: {//   label: "时间组2件",//   type: "dateTime",//   dateType: "year",//   format: "yyyy-MM-dd",//   labelWidth: "100"// },confirm: {text: "查询", // 按钮文案type: "confirm",label: "     ",labelWidth: 0,isSearching: this.isSearching},reset: {type: "reset"},button: {type: "button"}},// 表单数据formDataInit: {id: "",page_number: 1,page_size: 10,time: formatDate_y_m_d(new Date()),tab: 1},// 表单校验规则formRules: {id: [{ required: true, message: "请输入id", trigger: "blur" },{ min: 3, max: 5, message: "长度在 3 到 5 个字符", trigger: "blur" }],status: [{ required: true, message: "请选择", trigger: "change" }]}};},methods: {getList() {console.log("提交了", this.formDataInit);},handleQuery($event, from) {this.formDataInit.tab = from;console.log("4444", $event, from);switch (from) {case 3:this.formConfig.time.dateType = "year";this.formConfig.time.format = "yyyy-MM-dd";this.formConfig.time.placeholder = "选择年";break;case 2:this.formConfig.time.dateType = "month";this.formConfig.time.format = "yyyy-MM-dd";this.formConfig.time.placeholder = "选择年月";break;case 1:this.formConfig.time.dateType = "date";this.formConfig.time.format = "yyyy-MM-dd";this.formConfig.time.placeholder = "选择年月日";break;default:break;}}}
};
</script><style lang="scss" scoped>
.edit-from-style {/deep/.el-form {.el-form-item {height: 60px;line-height: 60px;align-items: center;text-align: center;justify-content: flex-start;display: flex;border: 1px solid #ebeef5;@include timeAndChooseColor2();margin-bottom: 0;&:not(:last-child) {border-bottom: none;}}.el-form-item__content {margin-left: 10px !important;width: 40%;@media screen and (max-width: 800px) {width: 66%;}}.el-form-item__label {width: 210px;line-height: 58px;padding-left: 10px;background-color: #fafafa;border-right: 1px solid #ebeef5;&:not(:last-child) {border-bottom: none;}@media screen and (max-width: 800px) {width: 90px;}@include tableBorderColor7();@include formBox();// @include bgColor2();}}
}
</style>

参考文章:添加链接描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/63145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode-中等题】240. 搜索二维矩阵 II

文章目录 题目方法一&#xff1a;暴力双for查找方法二&#xff1a;二分查找&#xff0c;对每二维数组进行拆分&#xff0c;一行一行的进行二分查找方法三&#xff1a;列倒序Z字形查找 题目 方法一&#xff1a;暴力双for查找 public boolean searchMatrix(int[][] matrix, int …

Android DataBinding 基础入门(学习记录)

目录 一、DataBinding简介二、findViewById 和 DataBinding 原理及优缺点1. findViewById的优缺点2. DataBinding的优缺点 三、Android mvvm 之 databinding 原理1. 简介和三个主要的实体DataViewViewDataBinding 2.三个功能2.1. rebind 行为2.2 observe data 行为2.3 observe …

探索隧道ip如何助力爬虫应用

在数据驱动的世界中&#xff0c;网络爬虫已成为获取大量信息的重要工具。然而&#xff0c;爬虫在抓取数据时可能会遇到一些挑战&#xff0c;如IP封禁、访问限制等。隧道ip&#xff08;TunnelingProxy&#xff09;作为一种强大的解决方案&#xff0c;可以帮助爬虫应用更高效地获…

Ceph IO流程及数据分布

1. Ceph IO流程及数据分布 1.1 正常IO流程图 步骤&#xff1a; client 创建cluster handler。client 读取配置文件。client 连接上monitor&#xff0c;获取集群map信息。client 读写io 根据crshmap 算法请求对应的主osd数据节点。主osd数据节点同时写入另外两个副本节点数据。…

Node.js 应用的御用品: Node.js 错误处理系统

开发中&#xff0c;有些开发者会积极寻求处理错误&#xff0c;力求减少开发时间&#xff0c;但也有些人完全忽略了错误的存在。正确处理错误不仅意味着能够轻松发现和纠正错误&#xff0c;而且还意味着能够为大型应用程序开发出稳健的代码库。 特别是对于 Node.js 开发人员&am…

由Android10适配到Android12时遇到相关编译失败问题

最近Android系统各大应用商店联合发出公告&#xff0c;处于个人隐私安全考虑&#xff0c;强制APP适配到Android 11及以上版本。下面是其中应用市场的公告&#xff08;顺带提醒没适配的同学&#xff09;&#xff1a; 适配前的开发环境 名称版本Android studioGiraffe | 2022.3…

【板栗糖GIS】——360浏览器的下载图标隐藏在内部不方便,怎么修改

目录 1. 设置前的本来样子 2. 登录360的皮肤中心 3. 使用se13的经典皮肤 最近edge浏览器最近使用bilibili和notion都非常卡&#xff0c;时不时崩溃&#xff0c;不得不换浏览器使用&#xff0c;试来试去360浏览器最得我心&#xff0c;只不过广告太多&#xff0c;调教也是花了…

gitlab升级

1.下载需要的版本 wget -c https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-15.7.6-ce.0.el7.x86_64.rpm --no-check-certificate gitlab-ce-15.4.6-ce.0.el7.x86_64.rpm gitlab-ce-15.7.6-ce.0.el7.x86_64.rpm gitlab-ce-15.9.7-ce.0.el7.x86_64.rpm g…

小文智能GPT助手介绍

如何使用小文交互的GPT助手&#xff0c;让AI更加智能&#xff0c;适用更多场景&#xff1f; 在小文智能最新推出的4.0版本&#xff0c;有一个新功能&#xff0c;叫做GPT助手。GPT助手&#xff0c;顾名思义&#xff0c;即在小文智能的场景中&#xff0c;接入ChatGPT&#xff0c…

最新智能AI系统ChatGPT网站程序源码+详细图文搭建教程/支持GPT4/WEB-H5端+微信公众号版源码

一、AI系统 如何搭建部署AI创作ChatGPT系统呢&#xff1f;小编这里写一个详细图文教程吧&#xff01;SparkAi使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到AIGC系统&#xff01; 1.1 程序核心功能 程序已支持ChatGPT3.5/GPT-4提问、AI绘画、Midjourney绘画&#xf…

云计算中的数据安全与隐私保护策略

文章目录 1. 云计算中的数据安全挑战1.1 数据泄露和数据风险1.2 多租户环境下的隔离问题 2. 隐私保护策略2.1 数据加密2.2 访问控制和身份验证 3. 应对方法与技术3.1 零知识证明&#xff08;Zero-Knowledge Proofs&#xff09;3.2 同态加密&#xff08;Homomorphic Encryption&…

某次护网红队getshell的经历

信息收集 某企业提供信息&#xff1a;企业官网的真实外网ip&#xff0c;内网ip 企业官网比较硬&#xff0c;从控股超过51%的子公司入手 通过企查查找到一堆控股高的子公司&#xff0c;通过ICP/IP地址/域名信息备案管理系统查找子公司官网&#xff0c;收集二级域名。通过google…

ESP-C3入门22. 基于VSCODE使用内置JTAG调试程序

ESP-C3入门22. 基于VSCODE使用内置JTAG调试程序 一、简介1. 内置 jtag 介绍2. OpenOCD3. 准备工作 二、操作步骤1. 接线2. 在VSCode设置端口等信息3. 测试编译烧录 三、调试程序 一、简介 1. 内置 jtag 介绍 在ESP32中&#xff0c;内置了一个用于JTAG调试的特殊程序&#xff…

typescript的~~和双感叹号符号使用

&#xff08;标题不给用“!”&#xff09; "~~"符号使用 1.对于number类型的值&#xff0c;~~是取整作用 const num: number 3.14; const roundedNum: number ~~num; // 3 2.对于boolean类型的值&#xff0c;~ ~ true还是true&#xff0c;false还是false “!!”…

【C++】 C++11(右值引用,移动语义,bind,包装器,lambda,线程库)

文章目录 1. C11简介2. 统一的列表初始化2.1 &#xff5b;&#xff5d;初始化2.2 std::initializer_list 3. 声明3.1 auto3.2 decltype3.3 auto与decltype区别3.4 nullptr 4. 右值引用和移动语义4.1 左值引用和右值引用4.2 左值引用与右值引用比较4.3 右值引用使用场景和意义4.…

云原生Kubernetes:二进制部署K8S多Master架构(三)

目录 一、理论 1.K8S多Master架构 2.配置master02 3.master02 节点部署 4.负载均衡部署 二、实验 1.环境 2.配置master02 3.master02 节点部署 4.负载均衡部署 三、总结 一、理论 1.K8S多Master架构 (1) 架构 2.配置master02 &#xff08;1&#xff09;环境 关闭防…

『SpringBoot 源码分析』run() 方法执行流程:(2)刷新应用上下文-准备阶段

『SpringBoot 源码分析』run() 方法执行流程&#xff1a;&#xff08;2&#xff09;刷新应用上下文-准备阶段 基于 2.2.9.RELEASE问题&#xff1a;当方法进行了注释标记之后&#xff0c;springboot 又是怎么注入到容器中并创建类呢&#xff1f; 首先创建测试主程序 package …

PMP项目管理主要学习内容是什么?

PMP项目管理是指根据美国项目管理学会(Project Management Institute&#xff0c;简称PMI)制定的项目管理知识体系和方法论进行项目管理的一种认证。PMP主要关注项目的规划、执行和控制等方面的知识和技能。 下面是PMP项目管理《PMBOK指南》第六版的主要学习内容&#xff1a; …

Matlab图像处理-灰度分段线性变换

灰度分段线性变换 如数学涵义的分段一般&#xff0c;分段线性变换就是将图像不同的灰度范围进行不同的线性灰度处理。其表达式可表示如下&#xff1a; 灰度分段线性变换可根据需求突出增强目标区域&#xff0c;而不增强非目标区间&#xff0c;达到特定的显示效果。 示例程序 …

通讯录(C语言)

通讯录 一、基本思路及功能介绍二、功能实现1.基础菜单的实现2.添加联系人信息功能实现3.显示联系人信息功能实现4.删除联系人信息功能实现5.查找联系人信息功能实现6.修改联系人信息功能实现7.排序联系人信息功能实现8.加载和保存联系人信息功能实现 三、源文件展示1.test.c2.…