Vue2+ElementUI表单、Form组件的封装

Vue2+ElementUI表单、Form组件的封装 :引言

在 Vue2 项目中,ElementUI 的 el-form 组件是常用的表单组件。它提供了丰富的功能和样式,可以满足各种需求。但是,在实际开发中,我们经常会遇到一些重复性的需求,比如:

  • 需要对表单进行校验
  • 需要对表单数据进行重置
  • 需要在表单中添加额外的功能,比如动态添加表单项等

为了提高开发效率,我们可以对 el-form 组件进行封装,将这些重复性的需求抽象成通用的功能。这样,在后续的项目中,我们就可以直接使用封装好的组件,而无需重复开发。

预期效果

预期效果如下。
在这里插入图片描述

创建表单组件

先把架子搭起来,组件名为H3yunFormCompV1,这个是随便取的哈。然后随便在哪个地方用上,方便测试。

<template><div><el-form></el-form></div>
</template><script>
export default {name: "H3yunFormCompV1",data() {return {}},props: {},mounted() {},methods: {}
}
</script><style scoped></style>

父组件传递表单数据,子组件遍历数据

formData数据传递过去。formData是一个列表,每个对象的结果如下{label: null, value: null}非常的简单。

 <H3yunFormCompV1 :formData="formData"></H3yunFormCompV1>data() {return {
formData: []
}
}

子组件如下:使用v-for遍历formData,并把label和value取出来。

<template><div><el-form ref="form" :model="form" :inline="true"><el-form-item v-for="(item,key) in formData" :key="key" :label="item.label"><el-input v-model="item.value"></el-input></el-form-item></el-form></div>
</template><script>
export default {name: "H3yunFormCompV1",data() {return {form: {name: '',region: '',date1: '',date2: '',delivery: false,type: [],resource: '',desc: ''}}},props: {formData: Array},mounted() {},methods: {}
}
</script><style scoped></style>

添加disabled属性

子组件的完整代码

<template><div><el-row><el-formref="form":model="form"label-position="top"size="small"><el-col :span="6" v-for="(item,key) in formData" :key="key"><div class="box"><el-form-item :label="item.label"><el-input v-model="item.value" :disabled="item.disabled"></el-input></el-form-item></div></el-col></el-form></el-row></div>
</template><script>
export default {name: "H3yunFormCompV1",data() {return {form: {name: '',region: '',date1: '',date2: '',delivery: false,type: [],resource: '',desc: ''}}},props: {formData: Array},mounted() {},methods: {}
}
</script><style>
.box {font-size: 14px;padding: 6px 12px;color: #304265;background: #f8fafc;border-radius: 4px;min-height: 22px;box-sizing: content-box;font-family: PingFangSC-Regular, PingFang SC;font-weight: 400;
}.box .el-form-item__label {position: relative;font-size: 14px;font-family: PingFangSC-Regular, PingFang SC;font-weight: 400;color: #304265;font-weight: 400 !important;
}
</style>

效果如下:

在这里插入图片描述

适配JSON数据

先看效果,下面是销量预测的json数据。
在这里插入图片描述
代码如下:主要是把json数据解析为了一个个表单项。

<template><div><el-row><el-formref="form":model="form"label-position="top"size="small"><el-col :span="6" v-for="(item,key) in formStructure" :key="key"><div class="box"><el-form-item :label="item.label"><el-input v-model="item.value" :disabled="item.disabled"></el-input></el-form-item></div></el-col></el-form></el-row></div>
</template><script>
export default {name: "H3yunFormCompV1",data() {return {form: {},formStructure: []}},props: {formData: Array},watch: {// 监控父组件的表单数据formData: {handler(newFormData) {// 当 formData 变化时执行的操作// 解析新表单结构this.parseFormStructure(newFormData);},deep: true, // 深度监听,用于监听数组或对象内部的变化},},mounted() {// 解析新表单结构 - 第一次点击时执行this.parseFormStructure()},methods: {// 解析表单结构parseFormStructure() {// 清除表单结构和表单数据this.formStructure = []this.form = {}const formStructure = []// column的数据类型:{ label: null, value: null, prop: null, disabled: null, dataType: null}this.formData.forEach(column => {if (column.dataType == undefined) {column.dataType = 'text'}// 如果数据是json,需要把JSON数据装为column的结构if (column.dataType == 'json') {const label = column.labelconst prop = column.propconst jsonValue = column.valueconst disabled = column.disabledconst jsonObj = JSON.parse(jsonValue)// 构建column对象Object.keys(jsonObj).forEach(key => {const childLabel = `${label}.${key}`const childProp = `${prop}.${key}`const childValue = jsonObj[key]const childDisabled = disabledconst childColumn = {label: childLabel,value: childValue,prop: childProp,disabled: childDisabled,dataType: 'text'}formStructure.push(childColumn)})} else {formStructure.push(column)}})this.formStructure = formStructure}}
}
</script><style>
.box {font-size: 14px;padding: 6px 12px;color: #304265;background: #f8fafc;border-radius: 4px;min-height: 22px;box-sizing: content-box;font-family: PingFangSC-Regular, PingFang SC;font-weight: 400;
}.box .el-form-item__label {position: relative;font-size: 14px;font-family: PingFangSC-Regular, PingFang SC;font-weight: 400;color: #304265;font-weight: 400 !important;
}
</style>

表单提交

首先写个提交按钮,并添加个change表单提交事件。

 <el-button type="primary" size="small" @change="submitForm">提交</el-button>

提交逻辑如下

// 提交的数据在this.form里面,表单验证通过后可以使用axios把表单数据提交到服务器。
submitForm() {// 使用 this.$refs.form.validate() 进行表单验证this.$refs.form.validate((valid) => {if (valid) {// 表单验证通过,执行提交操作// 在这里你可以使用 Axios 或其他方式提交数据到后端// 示例:假设有一个名为 submitData 的方法用于提交数据this.submitData();} else {// 表单验证失败,可以做一些处理,如提示用户this.$message.error('表单验证失败,请检查输入信息。');}});},submitData() {// 在这里执行提交数据的操作// 可以使用 Axios 或其他方式发送数据到后端// 示例:假设有一个名为 postData 的方法用于发送数据// postData(this.form)this.$message.success('表单提交成功!');}

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

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

相关文章

16.WEB渗透测试--Kali Linux(四)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;15.WEB渗透测试--Kali Linux&#xff08;三&#xff09;-CSDN博客 1.crunch简介与使用 C…

分布式CAP理论

CAP理论&#xff1a;一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和分区容错性&#xff08;Partition tolerance&#xff09;。是Eric Brewer在2000年提出的&#xff0c;用于描述分布式系统基本性质的定理。这三个性质在分布式系统…

SQLZoo:SELECT from WORLD Tutorial/zh

name continent area population gdp Afghanistan Asia 652230 25500100 20343000000 Albania Europe 28748 2831741 12960000000 … name:國家名稱 continent:洲份 area:面積 population:人口 gdp:國內生產總值 Country Profile 在這教程中&#xff0c;我們會使用SELECT語句&…

python pytest 最简单的接口自动化测试框架

最近由于工作的原因&#xff0c;需要开发一个接口自动化测试框架&#xff0c;使用pytest框架、数据驱动&#xff0c;并展示直观的测试报告。 具体的开发过程如下&#xff1a; 安装必要的库&#xff1a; pytest&#xff1a;用于编写和运行测试用例。requests&#xff1a;用于发…

FPGA静态时序分析与约束(一)、理解亚稳态

系列文章目录 FPGA静态时序分析与约束&#xff08;二&#xff09;、时序分析 FPGA静态时序分析与约束&#xff08;三&#xff09;、读懂vivado时序报告 文章目录 系列文章目录前言一、概述一、何为亚稳态&#xff1f;二、图解亚稳态三、什么时候亚稳态会导致系统失效&#xff…

Jsch实践(三):如何使用Jsch的ChannelShell类,在远程服务器上执行脚本命令?

如何使用Jsch的ChannelShell类&#xff0c;在远程服务器上执行脚本命令 要使用JSch的ChannelShell类在远程服务器上执行脚本命令&#xff0c;你需要创建一个shell通道&#xff0c;然后向这个通道的输入流发送命令&#xff0c;并读取输出流来获取命令的响应。下面是一个示例代码…

k8s部署hadoop

&#xff08;作者&#xff1a;陈玓玏&#xff09; 配置和模板参考helm仓库&#xff1a;https://artifacthub.io/packages/helm/apache-hadoop-helm/hadoop 先通过以下命令生成yaml文件&#xff1a; helm template hadoop pfisterer-hadoop/hadoop > hadoop.yaml用kube…

apache和tomcat的优化总结概述

一. tomcat 的优化 Tomcat 作为一款广泛使用的 Java Web 应用服务器&#xff0c;其性能优化可以从以下几个方面进行&#xff1a; ① 内存配置优化&#xff1a; 调整JVM堆内存大小&#xff08;-Xms和-Xmx参数&#xff09;&#xff0c;以确保Tomcat在处理大量并发请求时有足够…

Unity PS5开发 天坑篇 之 申请开发者与硬件部署01

腾了好几天终于把PS5开发机调试部署成功, 希望能帮到国内的开发者, 主机游戏PlayStation/Nintendo Switch都是比较闭塞的&#xff0c;开发者账号是必须的。 开发环境有两个部分&#xff0c;一是DEV Kit 开发机, TEST Kit测试机两部分组成&#xff0c;二是Unity的支持库(安装后…

vue3 ref 和 reactive 区别

Vue 3 引入了两种新的响应式 API&#xff1a;ref 和 reactive。这两个 API 都用于创建响应式数据&#xff0c;但它们的使用场景和行为有所不同。 ref 用途&#xff1a;ref 用于创建基本数据类型的响应式引用&#xff0c;如字符串、数字、布尔值等。 使用方式&#xff1a;在模…

最新开源解密版TwoNav网址导航系统源码

源码简介 2024最新开源解密版TwoNav网址导航系统源码去授权破解版 内置二十多套主题模板。 已去授权&#xff0c;最新开源解密版。TwoNav 是一款开源的书签&#xff08;导航&#xff09;管理程序&#xff0c;使用PHP SQLite 3开发&#xff0c;界面简洁&#xff0c;安装简单&…

FFmepg--音频编码流程--pcm编码为aac

文章目录 基本概念流程apicode(核心部分) 基本概念 从本地⽂件读取PCM数据进⾏AAC格式编码&#xff0c;然后将编码后的AAC数据存储到本地⽂件。 PCM样本格式&#xff1a;未经压缩的⾳频采样数据裸流 参数&#xff1a; Sample Rate : 采样频率Sample Size : 量化位数Number o…

Matlab进阶绘图第45期—蝴蝶气泡图

蝴蝶气泡图是一种特殊的柱泡图/气泡柱状图。 蝴蝶图一般由左右两个水平柱状图组合而成&#xff0c;其形如蝴蝶展翅&#xff0c;可以很直观地展示两种数据直接的差异。 而蝴蝶气泡图则是在两个水平柱状图每根柱子外侧额外添加大小不同的气泡&#xff0c;用于表示另外一个数据变…

使用IDEA2023创建传统的JavaWeb项目并运行与调试

日期:2024-0312 作者:dusuanyun 文档环境说明: OS:Deepin 20.9(Linux) JDK: OpenJDK21 Tomcat:10.1.19 IDEA: 2023.3.4 (Ultimate Edition) 本文档默认已经安装JDK及环境变量的配置。 关键词…

单片机设计-超声波视力保护仪的设计与实现

项目介绍 技术&#xff1a;C语言、单片机等 本设计利用超声波技术检测眼睛与书本的距离&#xff0c;调整看书位置&#xff0c;通过光敏检测判断环境光线强度是否适合阅读&#xff0c;并通过定时器设定阅读时长&#xff0c;以此解决人们由于看书姿势的错误&#xff0c;阅读环境…

Android11 FallbackHome启动和关闭流程分析

Android 7.0引入了新特性&#xff1a;Direct Boot Mode&#xff0c;设备启动后进入的一个新模式&#xff0c;直到用户解锁&#xff08;unlock&#xff09;设备此阶段结束。在这个模式下&#xff0c;系统调用 resolveHomeActivity 找到的是FallbackHome &#xff0c;而不是我们的…

Python keyword-only参数

keyword-only 参数是Python 3中引入的一种新的参数语法。它允许您在定义函数时强制要求某些参数必须以关键字参数的形式传递。这种机制有助于提高代码的可读性和可维护性。 以下是 keyword-only 参数的语法: def function_name(arg1, arg2, *, kwarg1, kwarg2value):# 函数体…

Vscode screen 模式终端窗口查看历史信息

进入查看模式 ctrl a, [ 退出 ctrl c

CPU、GPU、IPU、NPU、TPU、LPU、MCU、MPU、SOC、DSP、FPGA、ASIC、GPP、ECU、

CPU&#xff1a; 中央处理器&#xff08;Central Processing Unit&#xff09;是一块超大规模的集成电路&#xff0c;是一台计算机的运算核心&#xff08;Core&#xff09;和控制核心&#xff08; Control Unit&#xff09;。 它的功能主要是解释计算机指令以及处理计算机软件…

关于git提交代码时报错Committer identity unknown的解决方案

今天安装好git后&#xff0c;创建新项目&#xff0c;当git上传提交时出现了一个问题&#xff0c;如下&#xff1a; 解释 Commit failed - exit code 128 received, with output: *** Please tell me who you are. Run git config --global user.email "youexample.com&q…