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

news2024/11/29 14:54:12

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 = false
			            row.state = 1
			            this.tableData.forEach(item => {
			              if(item.id == row.id) {
			                row.measure = item.measure
			                row.createTime = item.createTime
			              }
			            })
			          }
			          break
			        case '编辑':
			          console.log("当前是编辑操作", row);
			          row.show = true
			          row.state = 0
			          break
			        case '删除':
			          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为false
		        this.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)
		            }
		          })
		          // 初始表格数据 与 目前表格 中已保存的数据对比
		          // 返回被删除数据的id
		          let m = this.filterArr(arr, this.tableData)
		          // 被删除数据形成数组(被删除的数据在初始表格中)
		          this.tableData.forEach(item => {
		            m.forEach(val => {
		              if (item.id == val) {
		                // deletedFlag
		                item.deletedFlag = 0
		                arr2.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.EQ
		            delete item.show
		            delete 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 = 0
		              delete item.show
		              delete 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.coloradmin.cn/o/741437.html

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

相关文章

如何学习编写安全的PHP代码? - 易智编译EaseEditing

学习编写安全的PHP代码是保证应用程序安全的重要一环。下面是几个建议来帮助你学习编写安全的PHP代码&#xff1a; 学习安全编程原则&#xff1a; 了解常见的安全漏洞类型&#xff0c;如跨站脚本攻击&#xff08;XSS&#xff09;、SQL注入、跨站请求伪造&#xff08;CSRF&…

如何刷新对黑客的认识?

黑客一般有10种类型 1、白帽黑客 白帽黑客是指通过实施渗透测试&#xff0c;识别网络安全漏洞&#xff0c;为政府及组织工作并获得授权或认证的黑客。他们也确保保护免受恶意网络犯罪。他们在政府提供的规章制度下工作&#xff0c;这就是为什么他们被称为道德黑客或网络安全专…

springboot项目中引入本地依赖jar包,并打包到lib文件夹中

1.springboot项目中引入本地依赖jar包&#xff0c;并打包到lib文件夹中 描述&#xff1a;下载了第三方相关jar包后&#xff0c;项目中引入本地jar&#xff0c;测试环境正常&#xff0c;打包线上报错提示为找到该jar 原因&#xff1a;应该在/WEB-INF/lib/xxx.jar&#xff0c;被…

vite-plugin-mock配置报错“localEnabled”不在类型”ViteMockOptions”中

vue3vite安装vite-plugin-mock之后配置报错&#xff1a; “localEnabled”不在类型”ViteMockOptions”中。 在vite.config.ts中共添加viteMockServe({ localEnabled: command ‘serve’, }),之后报了一下错误&#xff1a; 解决方法&#xff1a;与vite-plugin-mock版本有关&a…

揭示Android黑客之道:通过逆向工程揭开HTTPS流量

抓包是指在计算机网络中&#xff0c;通过监听网络流量并捕获通信数据包的过程。在网络通信中&#xff0c;数据以数据包的形式在网络上进行传输&#xff0c;每个数据包包含了源地址、目标地址、协议信息以及实际的数据内容。 抓包可以帮助我们了解网络通信的细节&#xff0c;包…

linux开发工具:Git

文章目录 1&#xff1a;Git简介2&#xff1a;Git简明指南2.1&#xff1a;创建新仓库2.2&#xff1a;检出仓库2.3&#xff1a;工作流2.4&#xff1a;添加和提交2.5&#xff1a;推送改动2.6&#xff1a;分支2.7&#xff1a;更新与合并2.8&#xff1a;标签2.9&#xff1a;替换本地…

STM32 主从蓝牙模块配置

前言&#xff1a; 最近在调试小车的时候&#xff0c;突然想要用两个蓝牙进行单片机和电脑的交互&#xff0c;之前一直用的都是从机的蓝牙。这里因为需要双机通信&#xff0c;所以也就顺便查询了一些资料&#xff0c;了解一下主从蓝牙模块的使用&#xff0c;以及双机通信的一些使…

在Linux中传输文件文件夹的10个scp命令

scp 命令的基本语法 下面的命令将读作 copy source_file_name进入destination_folder在destination_host使用username account。 > scp source_file_name usernamedestination_host:destination_folder里面有很多参数scp你可以使用的命令。以下是可能在日常使用中使用的参数…

【最短路+状压】CF1846 G

Problem - G - Codeforces 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>//#define int long longusing namespace std;const int mxn1e610; const int mxv1e610; const int mxe2e310; const int mod1e97; const int Inf0x3f3f3f3f;stru…

MOSS-RLHF实现大模型和人类价值观对齐

以 ChatGPT 为代表的大型语言模型&#xff08;LLM&#xff09;在各项任务上的高效表现彰显了其广阔发展前景。然而&#xff0c;大模型回复与人类价值偏好经常存在不一致问题。 如何让大模型更好的与人类价值观对齐&#xff0c;理解语言背后的含义&#xff0c;生成更具 “人情味…

elementPlus 树滚动到指定位置

根据当前选中id(colorsid)滚动到具体位置 参考如下&#xff1a; [element-ui] el-tree 滚动到指定选中的位置_element plus el-tree 滚轮定位_533_的博客-CSDN博客

open3d实现搜索在一个球内部的点云

目录 写在前面原理代码结果参考完 写在前面 1、本文内容 给定一个点云P和一个圆心为center&#xff0c;半径为r的球&#xff0c;搜索出P中属于球内的点 2、平台/环境 使用open3d, cmake&#xff0c;适用windows/linux 3、转载请注明出处&#xff1a; https://blog.csdn.net/q…

【代理模式】JDK动态代理示例代码

简介 JDK动态代理是一种基于JDK自带的Proxy类和InvocationHandler接口的代理方式。它可以在运行时动态地创建一个代理对象&#xff0c;该代理对象可以代替真实对象执行某些操作&#xff0c;从而实现对真实对象的代理。 与Java静态代理相比&#xff0c;JDK动态代理具有更高的灵…

[SSM]MyBatis的高级映射及延迟加载

目录 十二、MyBatis的高级映射及延迟加载 12.1多对一 级联属性映射 association 分步查询 12.2多对一延迟加载 12.3一对多 collection 分步查询 12.4一对多延迟加载 十二、MyBatis的高级映射及延迟加载 12.1多对一 多种方式&#xff0c;常见的三种方式&#xff1a; …

【DBA课程-笔记】第2章:MongoDB数据数据查询与分析

目录 一、课程大纲 二、MongoDB 条件查询 1. 制造 MongoDB 测试数据 2. MongoDB 数据查询 与 SQL对应关系 3. MongoDB 查询运算符 4. MongoDB 数据查询、条件查询、过滤 5. MongoDB 条件查询命令 6. MongoDB 数据查询数组条件 A. 精确匹配数组元素&#xff1a; B. 无…

【STM32MP135 - ST官方源码移植】第三章:OPTEE源码移植教程

STM32MP135 OPTEE源码移植教程 一、解压optee的源码压缩包二、拷贝新的设备树文件三、修改Makefile.sdk文件&#xff08;1&#xff09;增加stm32mp135d-atk设备树编译&#xff08;2&#xff09;修改编译器为arm-none-linux-gnueabihf&#xff08;3&#xff09;使用buildroot工具…

J2EEtdtXML介绍

目录 一.XML 什么是格式良好的XML XML的作用 标准的XML格式 二.元素定义 2.1 在XML加入DTD声明 2.2 元素的分类 2.3 元素的限制 三.属性定义 语法 属性类型type 属性描述 tdt解析 四.XML和JSON的区别 五.思维导图 一.XML 什么是格式良好的XML …

请求响应-数组集合参数的接受

数组集合参数 数组参数&#xff1a;请求参数名与形参数组名称相同且请求参数为多个&#xff0c;定义数组类型形参即可接受参数 具体关键代码如下&#xff1a; 在psotman中发出对应请求&#xff0c;结果如下&#xff1a; 集合参数&#xff1a;请求参数与形参集合名称相同且请求…

利用Python给图像添加标签

一、需求&#xff1a; 给指定的图片添加标签 二、代码&#xff1a; # !/usr/bin/env python # coding: utf-8import tkinter as tk from tkinter import filedialog, messagebox import os import json from google.protobuf.json_format import MessageToJson from clarifa…

分布式系统常见问题

一.概述 分布式系统存在网络&#xff0c;时钟&#xff0c;以及许多不可预测的故障。分布式事务&#xff0c;一致性与共识问题&#xff0c;迄今为止仍没有得到很好的解决方案。要想完美地解决分布式系统中的问题不太可能&#xff0c;但是实践中应对特定问题仍有许多可靠的解决方…