【Element】el-form和el-table嵌套实现表格编辑并提交表单校验

news/2024/11/24 6:50:02/

目录

一、背景

二、功能实现

2.1、el-form和el-table嵌套说明

2.2、具体代码

三、实际项目应用

3.1、增加添加与删除操作

3.2、添加和删除代码

3.4、实际效果


一、背景

页面需要用到表格采集用户数据,提交时进行表单校验;即表单中嵌套着表格,保存时进行表单校验

二、功能实现

2.1、el-form和el-table嵌套说明

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

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

rules为表单绑定的校验规则

:prop="'tableData.' + scope.$index + '.name'" 绑定传入Form 组件的 model 中对应的字段name

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

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

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

2.2、具体代码

<template><div><el-form:model="formData"ref="formRef":rules="rules"label-width="108px":inline="true"><el-table:data="formData.tableData"style="width: 100%" border><el-table-column type="index" width="55" align="center"></el-table-column><el-table-column label="姓名" prop="name" resizable align="center" header-align="center"><template slot-scope="scope"><el-form-item :prop="'tableData.' + scope.$index + '.name'" :rules="rules.name"><el-input type="text" size="small" placeholder="请输入姓名" v-model="scope.row.name"></el-input></el-form-item></template></el-table-column><el-table-column label="年龄" prop="age" resizable align="center" header-align="center"><template slot-scope="scope"><el-form-item :prop="'tableData.' + scope.$index + '.age'" :rules="rules.age"><el-input type="text" size="small" placeholder="请输入年龄" v-model="scope.row.age"></el-input></el-form-item></template></el-table-column><el-table-column label="性别" prop="sex" resizable align="center" header-align="center"><template slot-scope="scope"><el-form-item :prop="'tableData.' + scope.$index + '.sex'" :rules="rules.sex"><el-input type="text" size="small" placeholder="请输入性别" v-model="scope.row.sex"></el-input></el-form-item></template></el-table-column></el-table><el-form-item class="footer"><el-button type="primary" @click="save">保存</el-button><el-button>取消</el-button></el-form-item></el-form></div>
</template><script>
export default{data(){return{formData:{tableData:[{name:'张三',age:18,sex:''},{name:'李四',age:19,sex:''},]},rules:{name:[{ required: true, message: '请输入姓名', trigger: 'blur' },],age:[{ required: true, message: '请输入年龄', trigger: 'blur' },],sex:[{ required: true, message: '请输入性别', trigger: 'blur' },],}}},methods:{//保存save(){this.$refs.formRef.validate((valid) => {console.log('valid',valid);if(valid){//如果valid为true,表示校验通过,可以提交表单,调取接口进行保存console.log('表单校验通过');}else {this.$message.warning("请填写完整的数据");}})},}
}
</script><style lang="scss" scoped>
.footer{margin-top: 50px;
}
</style>

三、实际项目应用

3.1、增加添加与删除操作

需求:表格增加操作项,具有添加和删除按钮,第一项无法删除,点击添加时,动态增加表格的行数,点击删除的时候,删除表格的行数据。

3.2、添加和删除代码

结构:直接添加一个表格项

<el-table-column label="操作" resizable align="center" header-align="center"><template slot-scope="{$index}"><el-button type="primary" icon="el-icon-plus" circle @click="addTable()" v-if="$index == 0"></el-button><el-button icon="el-icon-minus" circle @click="delTable($index)" v-if="$index > 0"></el-button></template>
</el-table-column>
methods:{//添加addTable(){let newArr = [{name:'',age:'',sex:''}]this.formData.tableData.push(...newArr)},//删除delTable(i){this.formData.tableData.splice(i,1)}
}

3.3、完整代码

<template><div><el-form:model="formData"ref="formRef":rules="rules"label-width="108px":inline="true"><el-table:data="formData.tableData"style="width: 100%" border><el-table-column type="index" width="55" align="center"></el-table-column><el-table-column label="姓名" prop="name" resizable align="center" header-align="center"><template slot-scope="scope"><el-form-item :prop="'tableData.' + scope.$index + '.name'" :rules="rules.name"><el-input type="text" size="small" placeholder="请输入姓名" v-model="scope.row.name"></el-input></el-form-item></template></el-table-column><el-table-column label="年龄" prop="age" resizable align="center" header-align="center"><template slot-scope="scope"><el-form-item :prop="'tableData.' + scope.$index + '.age'" :rules="rules.age"><el-input type="text" size="small" placeholder="请输入年龄" v-model="scope.row.age"></el-input></el-form-item></template></el-table-column><el-table-column label="性别" prop="sex" resizable align="center" header-align="center"><template slot-scope="scope"><el-form-item :prop="'tableData.' + scope.$index + '.sex'" :rules="rules.sex"><el-input type="text" size="small" placeholder="请输入性别" v-model="scope.row.sex"></el-input></el-form-item></template></el-table-column><el-table-column label="操作" resizable align="center" header-align="center"><template slot-scope="{$index}"><el-button type="primary" icon="el-icon-plus" circle @click="addTable()" v-if="$index == 0"></el-button><el-button icon="el-icon-minus" circle @click="delTable($index)" v-if="$index > 0"></el-button></template></el-table-column></el-table><el-form-item class="footer"><el-button type="primary" @click="save">保存</el-button><el-button>取消</el-button></el-form-item></el-form></div>
</template><script>
export default{data(){return{formData:{tableData:[{name:'张三',age:18,sex:'男'},{name:'李四',age:19,sex:''},]},rules:{name:[{ required: true, message: '请输入姓名', trigger: 'blur' },],age:[{ required: true, message: '请输入年龄', trigger: 'blur' },],sex:[{ required: true, message: '请输入性别', trigger: 'blur' },],}}},methods:{//保存save(){this.$refs.formRef.validate((valid) => {console.log('valid',valid);if(valid){//如果valid为true,表示校验通过,可以提交表单,调取接口进行保存console.log('表单校验通过');}else {this.$message.warning("请填写完整的数据");}})},//添加addTable(){let newArr = [{name:'',age:'',sex:''}]this.formData.tableData.push(...newArr)},//删除delTable(i){this.formData.tableData.splice(i,1)}}
}
</script><style>
.footer{margin-top: 50px;
}
</style>

3.4、实际效果

 最后:👏👏 😀😀😀 👍👍  


http://www.ppmy.cn/news/1296420.html

相关文章

汽车信息安全--芯片厂、OEM安全启动汇总(1)

目录 1.芯驰E3安全启动 2.STM32 X-CUBE-SBSFU 3.小米澎湃OS安全启动 4.小结 我在前篇文章里详细记录了车规MCU信息安全设计过程关于网络安全架构的思考过程,从芯片原厂、供应商、OEM等角度思考如何建立起完备的信任链; 不过这思考过程仅仅只是一家之言,因此我又对比了国…

【C++100个关键字使用介绍】

C 数据类型关键字类型修饰关键字类、结构体、联合和枚举关键字函数和访问权关键字控制语句关键字其他关键字C11 新增关键字C17 和 C20 新增的一些关键字 C 中的关键字是用于表示语言中预先定义好的、具有特殊意义的单词。这些关键字不能用作变量名、函数名或任何其他标识符名称…

树莓派点亮led(1)

更换清华源 树莓派更换国内源&#xff08;清华源&#xff09;_树莓派更换清华源-CSDN博客 查看python版本 安装pipx 安装引脚 查看引脚 #安装gpio 创建文件夹 创建py文件 运行python文件 ubuntu传递文件到树莓派 1、启用ubuntu端的新终端 2拷贝文件到home目录下的用户文件夹…

零信任 aTrust 系统升级

一、Web系统升级 1、需求背景 能实现控制台页面直接升级&#xff0c;无需后台升级。简化客户运维、提高升级体验、保障设备升级稳定性&#xff1b; 2、预置条件 aTrust控制中心SDPC与代理网关Proxy安装部署完成 下载好bin格式升级包 如果是虚拟化部署&#xff0c;提前打系…

【读书笔记】《我的天才女友》

这套书一共有四本&#xff0c;这个是第一本&#xff0c;作者意大利人埃莱娜费兰特&#xff0c;这个只是她的笔名&#xff0c;至今还不知道这位作者是谁&#xff0c;她以每年一本书的速度出了“那不勒斯四部曲”&#xff0c;这四本书以两个女主人公莉拉和莱农的友情为主线。 莉拉…

【C++PCL】点云处理DBSCAN聚类分割

作者:迅卓科技 简介:本人从事过多项点云项目,并且负责的项目均已得到好评! 公众号:迅卓科技,一个可以让您可以学习点云的好地方 本专栏特色:根据经验和大家分享每个参数的调试规范,解决大家因为参数的问题而产生的苦恼。 目录 1.原理介绍 2.代码效果 3.源码展示

构建 PHP 开发环境:使用 Docker 和阿里云镜像加速器

2. ji引言 docker Docker 是一个开源的容器化平台&#xff0c;它允许开发者打包应用及其依赖项到一个轻量级、可移植的容器中&#xff0c;然后可以在任何支持 Docker 的机器上运行这些容器。Docker 容器非常适合持续开发、测试和部署的工作流程。 主要特点&#xff1a; 轻量…

OpenAI ChatGPT-4开发笔记2024-05:windows下anaconda中设置visual studio code workspace

这里写自定义目录标题 1 安装anaconda和vscode2 Create an Anaconda Environment3 select Python Interpreter4 Workspace5 Open Workspace With File6 开发文件夹加入workspace7 美化 1 安装anaconda和vscode 标配。 2 Create an Anaconda Environment conda create --name…