Vue3+Element-Plus使用el-form和el-table嵌套实现表格编辑并提交表单校验

ops/2024/12/16 13:56:28/

el-form和el-table嵌套说明

① :model="formData" 给表单绑定数据,formData是表单的数据对象

② 表单数据对象formData中定义的tableData是表单内嵌套的表格显示数据

③ rules为表单绑定的校验规则

④ :prop="`tableData.${$index}.name`" 绑定传入Form 组件的 model 中对应的字段name

⑤ :rules="rules.name" 绑定表单校验规则

⑥ 整个html结构是一个大表单 el-form里边嵌套的el-table,而el-table中又嵌套了表单项 el-form-item支持编辑。

备注:大多情况下prop会按照惯有思维直接写入字段,而这里是动态绑定的,另外一定要记得每项动态写入rules来进行绑定表单校验 

具体代码

<template><div class="layout-padding"><div class="layout-padding-auto" style="background-color: #fff;"><el-form :model="formData" ref="formRef" :rules="rules" :inline="true"><el-table :data="formData.tableData" border><el-table-column type="index" align="center" label="序号" width="65"></el-table-column><el-table-column label="姓名" prop="name" resizable align="center" header-align="center"><template #default="{ row, $index }"><el-form-item :prop="`tableData.${$index}.name`" :rules="rules.name"><el-input type="text" placeholder="请输入姓名" v-model="row.name"></el-input></el-form-item></template></el-table-column><el-table-column label="年龄" prop="age" resizable align="center" header-align="center"><template #default="{ row, $index }"><el-form-item :prop="`tableData.${$index}.age`" :rules="rules.age"><el-input type="text" placeholder="请输入年龄" v-model="row.age"></el-input></el-form-item></template></el-table-column><el-table-column label="性别" prop="sex" resizable align="center" header-align="center"><template #default="{ row, $index }"><el-form-item :prop="`tableData.${$index}.sex`" :rules="rules.sex"><el-input type="text" placeholder="请输入性别" v-model="row.sex"></el-input></el-form-item></template></el-table-column><el-table-column label="操作" resizable align="center" header-align="center" width="200"><template #default="{ row, $index }"><el-button type="primary" icon="ele-Plus" circle @click="addTable()"v-if="$index == 0"></el-button><el-button icon="ele-Minus" circle @click="delTable($index)" v-else></el-button></template></el-table-column></el-table><el-form-item class="footer"><el-button @click="reset">重置</el-button><el-button type="primary" @click="save">保存</el-button></el-form-item></el-form></div></div>
</template><script lang="ts">
import { toRefs, reactive, defineComponent, getCurrentInstance, } from 'vue';export default defineComponent({setup() {const { proxy }: any = getCurrentInstance();const data = reactive({formData: {tableData: [{ name: '张三', age: 18, sex: '' },{ name: '李四', age: 19, sex: '' },] as any[]},rules: {name: [{ required: true, message: '请输入姓名', trigger: 'blur' },],age: [{ required: true, message: '请输入年龄', trigger: 'blur' },],sex: [{ required: true, message: '请输入性别', trigger: 'blur' },],}});//保存const save = () => {//第一条数据不进行校验if (data.formData.tableData.length == 1 &&data.formData.tableData[0].name == '' &&data.formData.tableData[0].age == '' &&data.formData.tableData[0].sex == '') {//将rules中的校验required设置为falsedata.rules.name[0].required = false;data.rules.age[0].required = false;data.rules.sex[0].required = false;} else {//如果不是第一条数据,将rules中的校验required设置为true进行校验data.rules.name[0].required = true;data.rules.age[0].required = true;data.rules.sex[0].required = true;}proxy.$refs.formRef.validate((valid: any) => {//如果valid为true,表示校验通过,可以提交表单,调取接口进行保存if (valid) {proxy.$message.success("保存成功");} else {proxy.$message.warning("请填写完整的数据");}})}//重置const reset = () => {proxy.$refs.formRef.resetFields()data.formData.tableData = [{ name: '张三', age: 18, sex: '' },{ name: '李四', age: 19, sex: '' },]}//添加const addTable = () => {let newArr = [{name: '',age: '',sex: ''}]data.formData.tableData.push(...newArr)}//删除const delTable = (i: number) => {data.formData.tableData.splice(i, 1)}return {...toRefs(data), save, reset, addTable, delTable};}
})
</script><style lang="scss" scoped>
.footer {width: 100%;margin-top: 50px;:deep(.el-form-item__content) {justify-content: center;}
}
</style>

效果图


http://www.ppmy.cn/ops/142382.html

相关文章

【unity】从零开始制作平台跳跃游戏--界面的认识,添加第一个角色!

在上一篇文章中&#xff0c;我们已经完成了unity的环境配置与安装⬇️ 【Unity】环境配置与安装-CSDN博客 接下来&#xff0c;让我们开始新建一个项目吧&#xff01; 新建项目 首先进入unityHub的项目页面&#xff0c;点击“新项目”&#xff1a; 我们这个系列将会以2D平台…

The Annotated Transformer

The Annotated Transformer 外网链接&#xff1a;源码解析Transformer The Annotated Transformer

【roadMap】我转行软件测试的经历

软件测试这行咋样&#xff1f; 如果你简单了解过「软件测试工程师」这个岗位&#xff0c;就会知道它的基本特点&#xff1a; 待遇比开发低&#xff0c;比其他行业高入门丝滑&#xff0c;算是技术岗最简单的一类测试行业有细分领域&#xff1a;功能、性能、自动化… 每个行业…

第一章 计算机网络概论

1.1小节&#xff1a;计算机网络的形成和发展&#xff08;重要知识点&#xff09; 早期计算机网络&#xff1a; 计算机技术与通信技术结合&#xff1a; 起步于1951年麻省理工学院林肯实验室开发的SAGE系统&#xff0c;被视为计算机与通信技术整合的先驱。民用首次应用&#xf…

100个python经典面试题详解(新版)

应老粉要求,每晚加餐一个最新面试题 包括Python面试中常见的问题,涵盖列表、元组、字符串插值、比较操作符、装饰器、类与对象、函数调用方式、数据结构操作、序列化、数据处理函数等多个方面。 旨在帮助数据科学家和软件工程师准备面试或提升Python技能。 19、字符串乘法是…

【NumPy进阶】:内存视图、性能优化与高级线性代数

目录 1. 深入理解 NumPy 的内存视图与拷贝1.1 内存视图&#xff08;View&#xff09;1.1.1 创建视图1.1.2 视图的特点 1.2 数组拷贝&#xff08;Copy&#xff09;1.2.1 创建拷贝1.2.2 拷贝的特点 1.3 视图与拷贝的选择 2. NumPy 的优化与性能提升技巧2.1 向量化操作示例&#x…

Python 命令搭建 Https的服务器

要使用Python命令行搭建HTTPS服务器&#xff0c;您可以使用http.server模块&#xff08;在Python 3.x中可用&#xff09;&#xff0c;并结合ssl模块来创建安全的HTTPS连接。以下是一个简单的步骤指南&#xff1a; 准备证书&#xff1a; 在搭建HTTPS服务器之前&#xff0c;您需要…

ORB-SLAM2源码学习:Tracking.cc:Tracking::TrackWithMotionModel恒速模型跟踪

前言 什么是恒速跟踪模型&#xff1f; 两个图像帧之间一般只有几十毫秒的时间&#xff0c;在这么短的时间内&#xff0c;可以做出如下合理的假设&#xff1a; 假设相机在短时间内的运动速度是恒定的&#xff0c;用之前帧的位姿和速度来预测当前帧的相机位姿&#xff0c;我们…