vue3,elementPlus和自己封装,点击 新增添加表单,删除表单,提交数据

ElementPlus下的form也有新增表单 如果你写H5等没找到合适的 自己也可以进行封装

实现3个代码讲解:1:ElementPlus的代码 2:自己书写的代码 3:自己把2的代码进行封装

1:ElementPlus的运行效果


在这里插入图片描述

点击提交

在这里插入图片描述

1:ElementPlus的代码

<template><el-formref="formRef":model="dynamicValidateForm"label-width="120px"class="demo-dynamic"><el-form-itemprop="email"label="Email":rules="[{required: true,message: 'Please input email address',trigger: 'blur',},{type: 'email',message: 'Please input correct email address',trigger: ['blur', 'change'],},]"><el-input v-model="dynamicValidateForm.email" /></el-form-item><el-form-itemv-for="(domain, index) in dynamicValidateForm.domains":key="domain.key":label="'Domain' + index":prop="'domains.' + index + '.value'":rules="{required: true,message: 'domain can not be null',trigger: 'blur',}"><el-input v-model="domain.value" /><el-button class="mt-2" @click.prevent="removeDomain(domain)">Delete</el-button></el-form-item><el-form-item><el-button type="primary" @click="submitForm(formRef)">提交</el-button><el-button @click="addDomain">新增</el-button><el-button @click="resetForm(formRef)">重置</el-button></el-form-item></el-form>
</template><script lang="ts" setup>
import { reactive, ref } from "vue";
import type { FormInstance } from "element-plus";const formRef = ref<FormInstance>();
const dynamicValidateForm = reactive<{domains: DomainItem[];email: string;
}>({domains: [{key: 1,value: "",},],email: "",
});interface DomainItem {key: number;value: string;
}const removeDomain = (item: DomainItem) => {const index = dynamicValidateForm.domains.indexOf(item);if (index !== -1) {dynamicValidateForm.domains.splice(index, 1);}
};const addDomain = () => {dynamicValidateForm.domains.push({key: Date.now(),value: "",});
};const submitForm = (formEl: FormInstance | undefined) => {if (!formEl) return;formEl.validate((valid) => {if (valid) {console.log("submit!");console.log(dynamicValidateForm, "dynamicValidateForm");} else {console.log("error submit!");return false;}});
};const resetForm = (formEl: FormInstance | undefined) => {if (!formEl) return;formEl.resetFields();
};
</script>  

2:自己书写的代码

在这里插入图片描述
点击提交的打印效果
在这里插入图片描述

 <template><div class="box"><template v-for="(item, index) in dataForm" :key="item.id"><divclass="box-b bg-ff"style="display: flex; justify-content: space-between"><div><div style="display: flex"><div class="">区域位置</div><input v-model="item.ipchange" type="text" /></div><div style="display: flex; margin-top: 10px"><div class="">危险有害因素</div><input type="text" v-model="item.errorText" /></div></div><div><el-button type="primary" @click="deleteClick(item.id)">删除</el-button></div></div></template><div><el-button type="primary" @click="handlerClick">新增</el-button><el-button type="primary" @click="subMitClick">提交</el-button></div></div>
</template><script setup lang="ts">
import { ref, reactive } from "vue";
const dataForm = reactive([{ id: 1, ipchange: "", errorText: "" },{ id: 2, ipchange: "", errorText: "" },
]);
const handlerClick = () => {dataForm.push({ id: Date.now(), ipchange: "", errorText: "" });
};
const deleteClick = (id: number) => {dataForm.forEach((item, index) => {item.id == id ? dataForm.splice(index, 1) : "";});
};
const subMitClick = () => {console.log(dataForm, "dataForm");
};
</script><style scoped>
.bg-ff {background: #fff;
}
.box {width: 30vw;margin: auto;background: #fff;
}
.box-b {padding: 10px;width: 100%;overflow: hidden;box-sizing: border-box;border-radius: 10px;border: 1px solid #000;margin-top: 10px;
}
</style>

2的代码量太多 我们都会进行封装

3:自己把2的代码进行封装

components/insertForm.vue

<template><div><template v-for="(item, index) in NewdataForm" :key="item.id"><divclass="box-b bg-ff"style="display: flex; justify-content: space-between"><div><div style="display: flex"><div class="">区域位置</div><input v-model="item.ipchange" type="text" /></div><div style="display: flex; margin-top: 10px"><div class="">危险有害因素</div><input type="text" v-model="item.errorText" /></div></div><div><el-button type="primary" @click="deleteClick(item.id)">删除</el-button></div></div></template></div>
</template><script setup lang="ts">
import { ref, reactive, watch } from "vue";
const emit = defineEmits(["deleteClick"]);
const define = withDefaults(defineProps<{ dataForm: any[] }>(), {dataForm: () => [{ id: 1, ipchange: "", errorText: "" },{ id: 2, ipchange: "", errorText: "" },],
});//1: 这样不可以的; 下面的watch监听进行赋值的时候 NewdataForm=newvalue不可整体的赋值这个
// reactive  只能赋值到它下的某个属性下
//1: let errors = reactive( [...define.dataForm] );
// 2:但是使用这个 太麻烦
// 2:let NewdataForm = reactive({ dataForm: [...define.dataForm] });
// 3:使用 ref这个 可以直接赋值
let NewdataForm = ref([...define.dataForm]);watch(define.dataForm, (newvalue) => {// errors=newvalue  //错误的写法 如上1:// NewdataForm.dataForm=newvalue;可以正常运行如上2:NewdataForm.value = newvalue;
});
const deleteClick = (id: number) => {emit("deleteClick", id);
};
defineExpose({ NewdataForm });
</script><style scoped>
</style>

主文件引入

  <template><div class="box"><div><insertFormref="insertFormRef":dataForm="dataForm"@deleteClick="deletenewClick"></insertForm><el-button type="primary" @click="handlerClick">新增</el-button><el-button type="primary" @click="subMitClick">提交</el-button></div></div>
</template><script setup lang="ts">
import insertForm from "@/components/insertForm/index.vue";import { ref, reactive } from "vue";
const insertFormRef = ref<InstanceType<typeof insertForm>>();
var dataForm = ref([{ id: 1, ipchange: "", errorText: "" },{ id: 2, ipchange: "", errorText: "" },
]);
const handlerClick = () => {dataForm.value.push({ id: Date.now(), ipchange: "", errorText: "" });
};
const deletenewClick = (id: number) => {dataForm.value.forEach((item, index) => {item.id == id ? dataForm.value.splice(index, 1) : "";});
};
const subMitClick = () => {dataForm.value = insertFormRef.value.NewdataForm;console.log(dataForm.value, "dataForm");
};
</script><style >
.bg-ff {background: #fff;
}
.box {width: 30vw;margin: auto;background: #fff;
}
.box-b {padding: 10px;width: 100%;overflow: hidden;box-sizing: border-box;border-radius: 10px;border: 1px solid #000;margin-top: 10px;
}
</style>

效果一样
在这里插入图片描述

在这里插入图片描述
*

大多数人的疑问 我新增的input的vmodel绑定的值 和之前的表单一样的 ,都是ipchange: “”, errorText: “” 就是这样的 发给后端后端自己判断即可

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

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

相关文章

Python教程(3)——python开发工具vscode的下载与安装

Python的开发工具有很多款&#xff0c;很多都是非常好用的&#xff0c;其中vscode作为其中一款Python的开发工具&#xff0c;是非常轻量级的&#xff0c;今天我们来介绍一下vs code的下载与安装。 vscode的下载与安装 首先需要到vscode的官网&#xff0c;这个谷歌或者百度一下…

VSCode 注释后光标快速定位下一行

VSCode默认用 Ctrl / 注释一行时&#xff0c;光标停留在该行中。下面介绍如何注释后&#xff0c;光标会自动移动到下一行。 1.【View】 ->【Extensions】->【查找并安装Multi-command 扩展】 2.【File 】 -> 【Preferences 】->【Keyboard Shortcuts】&#xff08…

【人工智能】xAI——“X宇宙”又增添了一位新成员

个人主页&#xff1a;【&#x1f60a;个人主页】 &#x1f31e;热爱编程&#xff0c;热爱生活&#x1f31e; 文章目录 前言xAI团队成员做解开宇宙本质的AI 前言 有人问他&#xff0c;xAI公司是干啥的&#xff1f;马斯克的回答引用了其偶像、科幻作家道格拉斯・亚当斯的话&…

Python实现将pdf,docx,xls,doc,wps,zip,xlsx,ofd链接下载并将文件保存到本地

前言 本文是该专栏的第31篇,后面会持续分享python的各种干货知识,值得关注。 在工作上,尤其是在处理爬虫项目中,会遇到这样的需求。访问某个网页或者在采集某个页面的时候,正文部分含有docx,或pdf,或xls,或doc,或wps,或ofd,或xlsx,或zip等链接。需要你使用python自…

【运维小知识】(四)——linux常用命令

运维专栏&#xff1a;运维小知识 目录 1.&#x1f341;&#x1f341;用mv命令修改文件名 2.&#x1f343;&#x1f343;创建及删除文件夹即文件夹下所有文件 3.&#x1f342;&#x1f342;移动文件夹并重命名 4.&#x1f33f;&#x1f33f;复制文件 5.&#x1f344;&#x…

Python 算法基础篇之字符串操作:索引、切片、常用方法

Python 算法基础篇之字符串操作&#xff1a;索引、切片、常用方法 引言 1. 字符串的概念和创建2. 字符串的索引3. 字符串的切片4. 字符串的常用方法 a ) 查找子字符串 b ) 替换子字符串 c ) 拆分和连接字符串 总结 引言 字符串是一种常见的数据类型&#xff0c;在 Python 中对…

ARM微控制器 AM2432BSEFHIALXR、AM2432BSFFHIALV技术参数(32位MCU)

1、AM2432BSEFHIALXR 32位MCU采用293引脚FCCSP封装&#xff0c;工作频率最高可达800MHz。该微控制器专为需要结合处理和实时通信的工业应用而构建&#xff0c;例如远程I/O模块和电机驱动器。 核心处理器&#xff1a;ARM Cortex-M4F&#xff0c;ARM Cortex-R5F 内核规格&#xf…

pytest 禁用警告信息(忽略警告信息输出)

如图示例代码&#xff0c;提示test_001这个case 存在警告 新增pytest.ini 配置文件 [pytest] filterwarnings errorignore::UserWarning

携带时间戳主动写入数据到prometheus service(可乱序、go)

使用到的github公开项目 https://github.com/castai/promwrite Prometheus版本2.45.0 拉下来装依赖&#xff0c;然后使用 client_test.go t.Run(“write with custom options”, func(t *testing.T) 这个测试用例里面&#xff0c;删掉srv初始化的部分&#xff0c;这个是模拟一…

本地生活直播,和电商直播有什么不一样?

直播正在成为零售业的标配&#xff0c;当下最新的一条赛道是“本地生活直播”。 &#xff08;商家开始在美团等平台进行本地生活直播。摄影&#xff1a;李崧稷&#xff09; 今年618&#xff0c;在老牌电商平台拉着无数网店&#xff0c;拼尽全力想要堆高销量的时候&#xff0c;一…

微信小程序导入微信地址

获取用户收货地址。调起用户编辑收货地址原生界面&#xff0c;并在编辑完成后返回用户选择的地址。 1&#xff1a;原生微信小程序接口使用API&#xff1a;wx.chooseAddress(OBJECT) wx.chooseAddress({success (res) {console.log(res.userName)console.log(res.postalCode)c…

TensorFlow模块简介

TensorFLow框架内构建了很多高层次的API&#xff0c;可以显著减少编写程序的代码量&#xff0c;其中包含众多网络结构相关函数和数据载入、数据处理的方法。 tf.data.Dataset tf.data.Dataset是TensorFlow内置的数据输入模块&#xff0c;提供了专门用于数据输入的多种方法&am…

【Linux】进程间通信——管道/共享内存

文章目录 1. 进程间通信2. 管道匿名管道命名管道管道的特性管道的应用&#xff1a;简易的进程池 3. System V共享内存共享内存的概念共享内存的结构共享内存的使用代码实现 1. 进程间通信 进程间通信&#xff08;Inter-Process Communication&#xff0c;简称IPC&#xff09;是…

详细解析张雪峰老师对计算机专业的评价“进可攻,退可守”--【职场篇】

文章目录 张雪峰的评价计算机行业类的总结性指示就业面宽本科也不太卷的方向进可攻&#xff0c;退可守另一个就业出口--培训高校&#xff0c;大专&#xff0c;高职&#xff0c;科研机构&#xff0c;中小学计算机老师等等 就业总结导图持续学习&#xff0c;技术过人 总结 张雪峰…

你认为大数据的特点是什么?_光点科技

随着信息技术的迅猛发展&#xff0c;大数据已成为当今社会不可忽视的重要资源。它是指规模庞大且快速增长的数据集合&#xff0c;其中包含着宝贵的信息和见解。大数据的特点是多样而复杂的&#xff0c;它们塑造了我们的世界并深刻地影响着各行各业。 巨大的规模&#xff1a;大数…

消息重试框架 Spring-Retry 和 Guava-Retry

一 重试框架之Spring-Retry 1.Spring-Retry的普通使用方式 2.Spring-Retry的注解使用方式 二 重试框架之Guava-Retry 总结 图片 一 重试框架之Spring-Retry Spring Retry 为 Spring 应用程序提供了声明性重试支持。它用于Spring批处理、Spring集成、Apache Hadoop(等等)。…

Maven -- <dependencyManagement>管理子项目版本

背景&#xff1a; 一个旧项目&#xff0c;想使用mybatis-plus&#xff0c;想着这是比较基础的依赖包&#xff0c;就在父项目中添加对应依赖&#xff0c;如下: <!-- 依赖声明 --><dependencyManagement><dependencies><!-- mybatis-plus 依赖配置 -->&l…

Java Arrays类

Arrays类 介绍 用于管理或操作数组(比如排序和搜索) 常用方法 1、Arrays.toString(ints)&#xff1a;返回数组的字符串形式 int[] ints {1, 2, 3, 4, 5}; System.out.println(Arrays.toString(ints));2、sort排序(自然排序和定制排序) import java.util.Arrays; import …

python实现接口压力测试

python实现接口压力测试 直接上代码&#xff1a; # -*- coding: utf-8 -*-import json import requests import logginglogging.basicConfig(levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s) logger logging.getLogger(__name__)restime …

LayUI之增删改查

目录 一、前言 1.1 前言 1.2 前端代码(数据表格组件) 1.3 封装JS 二、LayUI增删改查的后台代码 2.1 编写Dao方法 2.1 增加 2.2 删除 2.3 修改 三、LayUI增删改查的前端代码 3.1 增加 一、前言 1.1 前言 上一篇文章我们一起做了LayUI的动态添加选项卡&#xff0c;这一篇…