Vue+element实现el-table行内编辑并校验

el-table行内编辑情况情况概要:之前在开发过程中对于element数据的新增,修改,删除。一般直接结合el-form使用。也就是新增的时候点新增然后出来一个弹框,里面嵌套一个表单,然后保存就好了。这次项目中要求所有的新增,修改,删除功能加在表格中,实现行内编辑功能。下面看一下大概效果
1.点击新增按钮,表格下方多出一行,可以进行编辑,确认时需要进行必填校验,取消时,该行直接删除掉:
在这里插入图片描述
2.已经点击确认的数据,如果需要修改的话,可以点击编辑按钮进行行内修改,点击取消的话,数据恢复原样:
在这里插入图片描述
在这里进行的取消一共要考虑到两个问题,如果是已经保存到数据库的数据在进行编辑后又取消时,数据不应该删除掉,而是恢复之前的状态。如果是新增的数据没有保存到数据库中的那么可以直接将其从表格清除。
调用接口也要考虑到两种方案:
简单的方案:在点击确认和删除时直接调用接口进行数据传递(这种适用于一次就修改当前行一条数据,直接在点击确认,删除时调用对应接口就行了。这种就不写了)。
较难的方案:表格下方添加一个保存按钮(图上没截图,自己加一下)。确认,取消,编辑,删除的数据都由前端自己记录,定义一个字段deletedFlag来判断数据状态,1则不删除,0为需要删除的数据,最后点保存的时候,直接将整个表格数据返回给后端。后端再根据deletedFlag来判断数据库中要保存哪些数据。

行内编辑代码简单展示:

// 要想表格行内编辑,则表单嵌套表格
<template><div><el-form ref="form" :model="form" :rules="formRule"><el-table :data="form.tableData" border stripe>// 序号<el-table-column type="index" label="序号" align="center" width="50"></el-table-column>//有必填校验的加 :rules、el-form-item ,scope.row.show控制当前行是否为可编辑状态<el-table-column prop="prop" label="管控措施" align="center">//作用域插槽<template slot-scope="scope"><div style="margin-top:18px"><el-form-item :prop="`tableData.${scope.$index}.measure`" :rules="formRule.measure"><el-input v-model="scope.row.measure" size="mini" placeholder="请输入内容" v-show="scope.row.show" maxlength="500" /><span v-show="!scope.row.show">{{ scope.row.measure }}</span></el-form-item></div></template></el-table-column>// 无必填校验写法<el-table-column prop="prop" label="创建时间" align="center"><template slot-scope="scope"><el-input v-model="scope.row.createTime" size="mini" placeholder="请输入内容" v-show="scope.row.show" /><span v-show="!scope.row.show">{{ scope.row.createTime }}</span></template></el-table-column>// 操作列<el-table-column prop="" label="操作" align="center" min-width="80"><template slot-scope="scope"><div class="deomDiv"><div size="mini" v-if="scope.row.state == 0" @click="handleClick(scope.$index, scope.row, '确定')">确定</div><div size="mini" v-if="scope.row.state == 0" @click="handleClick(scope.$index, scope.row, '取消')">取消</div><div size="mini" v-if="scope.row.state != 0" @click="handleClick(scope.$index, scope.row, '编辑')">编辑</div><div size="mini" v-if="scope.row.state != 0" @click="handleClick(scope.$index, scope.row, '删除')">删除</div></div></template></el-table-column></el-table><el-button @click="saveClick">保存</el-button></form></div> 
</template><script>
import { saveEvalue,
} from '@/api/common'   // 表格保存接口
export default {data() {return {form:{tableData: [], //双向绑定的表格()},tableData:[], // 储存后端给的初始表格formRule: {measure: [{ required: true, message: '请输入', trigger: 'blur' }],}},methods: {// 表格内嵌表单单条校验validateField(form, index) {let result = true;for (let item of this.$refs[form].fields) {if(item.prop.split(".")[1] == index){this.$refs[form].validateField(item.prop, err => {if(err != "") {result = false;}});}if(!result) break;}return result;},// 添加行addLine() {this.form.tableData.push({measure: '',createTime: '',state: 0,  // 0时显示确认、取消,1时显示编辑、删除show: true, // true为编辑状态,false为表格行状态})},// 操作handleClick(index, row, type) {switch (type) {case '确定':if (!this.validateField('form',index)) return  // 必填校验row.show = false  // 点击确定后,该行变为不可编辑状态row.state = 1  // 操作列变为编辑、删除break// 取消时,已保存过的数据恢复原样,未保存的数据直接清空case '取消':// 假设存在数据库里的数据有的唯一标识id,若该行无id,则表示数据库未曾保存过,点击取消前端直接删除该数据if (row.id == undefined) {this.form.tableData.splice(index, 1)// 数据库中有该数据,恢复到未修改前的状态} else {row.show = falserow.state = 1this.tableData.forEach(item => {if(item.id == row.id) {row.measure = item.measurerow.createTime = item.createTime}})}breakcase '编辑':console.log("当前是编辑操作", row);row.show = truerow.state = 0breakcase '删除':this.$confirm('确定删除?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {this.form.tableData.splice(index, 1)})break},// 数组1在数组2中查找自己不存在的数据,并返回查找键值组成的数组filterArr(arr1, arr2) {var key1=[]var key2=[]for(var i in arr1){key1.push( arr1[i].id)}for(var i in arr2){key2.push( arr2[i].id)}const arr = [...key1,...key2];const newArr = arr.filter(item => {return !(key1.includes(item) && key2.includes(item));});return newArr;},saveClick() {// flag为true,整个表格的数据都已点击确认为不可编辑状态了。flag为false,表格数据还有没保存的。let flag = true// 表格数组长度不为0,说明内部可能存在状态为1是之前保存过的数据 2新添加的数据 3以被删除的数据if (this.form.tableData.length != 0) {// 如果表格有数据没保存,flag为falsethis.form.tableData.forEach(item => {if (item.show == true) {flag = false}})if (!flag) {this.$message.warning("请确认列表信息")} else {// 表格数据都已确认可以保存let arr = []   // 之前存在的(也就是已经存入数据库当中的)let arr1 = []   // 被新增的(还未进入数据库)let arr2 = []   // 被删除的(已经进入数据库但是被删除的)// 表格实时数据区分this.form.tableData.forEach(item => {if (item.id) {// 之前存在的arr.push(item)} else {// 新增的arr1.push(item)}})// 初始表格数据 与 目前表格 中已保存的数据对比// 返回被删除数据的idlet m = this.filterArr(arr, this.tableData)// 被删除数据形成数组(被删除的数据在初始表格中)this.tableData.forEach(item => {m.forEach(val => {if (item.id == val) {// deletedFlagitem.deletedFlag = 0arr2.push(item)}})})console.log("之前存在的", arr);console.log("被新增的", arr1);console.log("被删除的", arr2);// 三个类型拼接一起let allArr = arr.concat(arr1).concat(arr2)// 前端自用的show,state不传给后端allArr.forEach(item => {item.eairValue = this.EQdelete item.showdelete item.state})// 保存接口saveEvalue(allArr).then(res => {if (res.code == 200) {this.$message.success(res.msg)} else {this.$message.warning(res.errorMsg)}})}// 如果当前表格数据长度为空} else {this.$confirm('未添加任何数据?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {// 初始表格数据不为空,则数据全部删除if (this.tableData.length != 0) {this.tableData.forEach(item => {item.deletedFlag = 0delete item.showdelete item.state})saveEvalue(this.tableData).then(res => {if (res.code == 200) {this.$message.success(res.msg)} else {this.$message.warning(res.errorMsg)}})// 初始表格数据为空,实时表格数据也为空,直接传个空数据} else {saveEvalue([]).then(res => {if (res.code == 200) {this.$message.success(res.msg)} else {this.$message.warning(res.errorMsg)}})}}).catch((e) => {if(e==='close'){}else if(e==='cancel'){}});}}}
</script>

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

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

相关文章

AppSpider Pro 7.4.053 for Windows - Web 应用程序安全测试

AppSpider Pro 7.4.053 for Windows - Web 应用程序安全测试 Rapid7 Dynamic Application Security Testing (DAST) 请访问原文链接&#xff1a;https://sysin.org/blog/appspider/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin…

【软件测试】Git 远程仓库的使用(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 查看远程仓库 想…

Web入门-HTTP协议

目录 HTTP概述 HTTP特点 HTTP请求协议 请求数据的格式 响应数据的格式 响应的状态码 HTTP协议的解析 HTTP概述 HTTP:Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定浏览器和服务器之间数据传输的规则。(即请求数据和响应数据的格式)以上一篇…

抖音短视频seo源码开发部署-技术分享(四)

一、 抖音短视频seo源码开发流程 抖音短视频SEO源码开发流程如下&#xff1a; 1.分析需求&#xff1a;首先需要明确你的SEO目标。分析竞争对手&#xff0c;了解抖音短视频平台的规则&#xff0c;选定目标关键词和主题。 2.编写代码&#xff1a;根据需求编写代码&#xff0c;…

Invalid name=“org.apache.dubbo.config.ApplicationConfig#0“

上一篇文章是springboot 集成 dubbo&#xff1a; spring boot 集成dubbo_Demonor_的博客-CSDN博客 在集成的时候出现了一些异常&#xff0c;在这里记录一下&#xff0c;并排查出原因 异常信息1&#xff1a; [2m2023-07-11 20:38:39.387[0;39m [32m INFO[0;39m [35m21492[0;…

【Flutter】Flutter 如何使用 flutter_swiper

文章目录 一、前言二、flutter_swiper 的概念三、Flutter 中的 flutter_swiper1. 使用的库2. 方法介绍 四、代码示例1. 简单示例2. 完整示例 五、总结 一、前言 在移动应用开发中&#xff0c;轮播图是一种常见的 UI 元素&#xff0c;它可以用来展示一系列的图片或者内容。在 F…

SQL-每日一题【550.游戏玩法分析Ⅳ】

题目 Table: Activity 编写一个 SQL 查询&#xff0c;报告在首次登录的第二天再次登录的玩家的比率&#xff0c;四舍五入到小数点后两位。换句话说&#xff0c;您需要计算从首次登录日期开始至少连续两天登录的玩家的数量&#xff0c;然后除以玩家总数。 查询结果格式如下所示…

OSS-Fuzz----OSS-Fuzz简介

【原文链接】OSS-Fuzz----OSS-Fuzz简介 一、OSS-Fuzz 简介 OSS-Fuzz是由Google开发和维护的一个开源项目&#xff0c;旨在帮助开发者改善软件的安全性和稳定性。它是一个自动化的模糊测试工具&#xff0c;可以在大规模的测试环境中发现软件中的漏洞和错误。 OSS-Fuzz使用模糊…

「深度学习之优化算法」(十)烟花算法

1. 烟花算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   烟花算法(Firework Algorithm,FWA)是一种受烟花爆炸产生火星,并继续分裂爆炸这一过程启发而得出的算法。算法的思想简单,但具体实现复杂。算法提出时间并不长,但是已经有了不少的改进研究和较为全…

skywalking安装

目录 skywalking部署示意图 server安装 裸机安装 docker单节点安装 docker集群安装 k8s安装 helm安装(官方) k8s yaml安装 动态配置安装 client agent安装 skywalking部署示意图 skywalking ui - web界面管理程序oap server - skywalking服务程序nacos - skywalking集…

OpenCV 的安装与配置指南(Windows环境,Python语言)

OpenCV 的安装与配置指南&#xff08;Windows环境&#xff0c;Python语言&#xff09; 导语一、安装 Python 二、安装 OpenCV 库三、配置 OpenCV 环境变量四、验证 OpenCV 安装总结 导语 OpenCV 是一个功能强大的计算机视觉库&#xff0c;广泛应用于图像处理和计算机视觉领域。…

MongoDB 简介及安装(windows环境下)

一、MongoDB 简介 1、MongoDB 是什么 MongoDB 是一个开源的、基于分布式的、面向文档存储的非关系型数据库。是非关系型数据库当中功能最丰富、最像关系数据库的。 MongoDB 将数据存储为一个文档&#xff0c;数据结构由键值(key>value)对组成。MongoDB 文档类似于 JSON 对…