Vue + ElementUI 实现可编辑表格及校验
效果

完整代码见文末
实现思路
-
使用两个表单分别用于实现修改和新增处理。
-
通过一个
editIndex变量判断是否是编辑状态来决定是否展示输入框,当点击指定行的修改后进行设置即可:<el-table-columnv-for="(column, index) in columns":key="index":label="column.label":prop="column.prop"align="center"><template #default="{ row, $index }"><div v-if="$index === editIndex" class="validate-info"><el-form-item :prop="column.prop"><el-input v-model="editRow[column.prop]"/></el-form-item></div><span v-else><span>{{ row[column.prop] }}</span></span></template> </el-table-column>edit(row, index) {if (this.editIndex > -1) {this.$message.warning('请先完成修改中的行')return}this.editRow = {...row}this.editIndex = index } -
通过隐藏表头实现新增表格和修改表格的合并,同时表格数据只有
addRow:<el-table :data="[addRow]" :show-header="false">... </el-table>
实现细节讲解
-
当无数据时只展示新增行:

通过设置以下样式即可:
/deep/ .el-table__empty-block {display: none; } -
新增或者修改数据行时增加行高用于显示校验信息:

行高通过以下样式进行控制,不处于新增或者修改状态时设置为 0 即可:
.add-table /deep/ .el-form-item {margin: 18px 0; }为了在修改时只设置修改行的行高,只需要只对输入框绑定样式即可:
<div v-if="$index === editIndex" class="validate-info"><el-form-item :prop="column.prop"><el-input v-model="editRow[column.prop]"/></el-form-item> </div>
完整代码
<template><div class="app"><el-formref="editableForm":model="editRow":rules="rules"label-width="0":show-message="true"class="editable-table"><el-table :data="tableData"><el-table-columnv-for="(column, index) in columns":key="index":label="column.label":prop="column.prop"align="center"><template #default="{ row, $index }"><div v-if="$index === editIndex" class="validate-info"><el-form-item :prop="column.prop"><el-input v-model="editRow[column.prop]"/></el-form-item></div><span v-else><span>{{ row[column.prop] }}</span></span></template></el-table-column><el-table-column label="操作" width="200" align="center"><template #default="{ row, $index }"><el-form-item><template v-if="$index === editIndex"><el-button type="success" size="mini" plain @click="save">保存</el-button><el-button type="info" size="mini" plain @click="cancel">取消</el-button></template><template v-else><el-buttontype="primary"size="mini"plain@click="edit(row, $index)">修改</el-button><el-popconfirmtitle="是否确认删除?"@confirm="deleteRow($index)"style="margin-left: 10px;"><el-button slot="reference" type="danger" size="mini" plain>删除</el-button></el-popconfirm></template></el-form-item></template></el-table-column></el-table></el-form><el-formref="addForm":model="addRow":rules="rules"label-width="0":show-message="true"class="add-table"><el-table :data="[addRow]" :show-header="false"><el-table-columnv-for="(column, index) in columns":key="index":label="column.label":prop="column.prop"align="center"><template #default="{ row }" class="validate-info"><div class="validate-info"><el-form-item :prop="column.prop"><el-input v-model="addRow[column.prop]"/></el-form-item></div></template></el-table-column><el-table-column label="操作" width="200px" align="center"><template #default="{ row }"><el-form-item><el-button type="success" size="mini" plain @click="add(row)">新增</el-button></el-form-item></template></el-table-column></el-table></el-form></div>
</template><script>
export default {data() {return {// 表格数据tableData: [{username: '张三',address: '北京'},{username: '李四',address: '上海'}],//配置列columns: [{label: '用户名',prop: 'username'},{label: '地址',prop: 'address'}],// 规则rules: {username: [{required: true, message: '请输入用户名', trigger: 'blur'}],address: [{required: true, message: '请输入地址', trigger: 'blur'}],},// 当前编辑行下标editIndex: -1,// 当前编辑行editRow: {username: '',address: ''},// 新增行addRow: {username: '',address: ''}}},methods: {save() {this.$refs.editableForm.validate((valid) => {if (valid) {this.tableData.splice(this.editIndex, 1, { ...this.editRow })this.editIndex = -1this.$message.success('修改成功')}return valid})},cancel() {this.editIndex = -1},edit(row, index) {if (this.editIndex > -1) {this.$message.warning('请先完成修改中的行')return}this.editRow = {...row}this.editIndex = index},add(row) {if (this.editIndex > -1) {this.$message.warning('请先完成修改中的行')return}this.$refs.addForm.validate((valid) => {if (valid) {this.addRow = {}this.tableData.push({ ... row})this.$message.success('新增成功')}return valid})},deleteRow(index) {this.tableData.splice(index, 1)this.$message.success('删除成功!');}}
}
</script><style scoped lang="less">
.app {padding: 20px;/deep/ .el-form-item {margin-bottom: 0;}
}.validate-info {/deep/ .el-form-item {margin: 18px 0;}
}.editable-table {/deep/ .el-table__empty-block {display: none;}
}.editable-table, .add-table {width: 60%;margin: 0 auto;
}
</style>
相关文章:
Vue + ElementUI 实现可编辑表格及校验
效果 完整代码见文末 实现思路 使用两个表单分别用于实现修改和新增处理。 通过一个editIndex变量判断是否是编辑状态来决定是否展示输入框,当点击指定行的修改后进行设置即可: <el-table-columnv-for"(column, index) in columns":key&qu…...
中介者模式——协调多个对象之间的交互
1、简介 1.1、概述 如果在一个系统中对象之间的联系呈现为网状结构,如下图所示: 对象之间存在大量的多对多联系,将导致系统非常复杂,这些对象既会影响别的对象,也会被别的对象所影响,这些对象称为同事对…...
启动Flink显示初始化状态怎么解决?
启动Flink显示初始化状态怎么解决? Flink On Yarn模式 问题 flnk任务在跑的过程中, 有时候任务停掉了 ,不过我有 定时任务,可以把失败的flink任务拉起来,但是因为最新的checkpoint做失败了,导致脚本无法拉…...
VB+SQL采购管理系统设计与实现
摘 要 本系统是基于为轴承企业采购部门开发的系统。课题主要采用自上而下的结构化程序设计方法与面向对象方法相结合的方法,致力于达到标准的现代化物流管理要求。帮助轴承企业采购部门全面实现电子化、自动化、标准化的现代化先进管理模式。 该系统使用Visualbasic.net编程…...
TBB库中实现协程(coroutine)的源码说明
源码请见: https://github.com/oneapi-src/oneTBB/blob/master/src/tbb/co_context.h 在windows系统,TBB(也就是intel 的 oneTBB库),通过windwos fiber(纤程)来实现协程(coroutine)。 创建一个协程,代码很简洁: inline void create_coroutine(corouti…...
【CSS弹性盒模型 display:flex;常用参数及常见的布局】
CSS弹性盒模型 display:flex;常用参数flex-directionjustify-contentalign-itemsflex-wrapflex-flowalign-contentorderflex-growflex-shrinkflex-basis 常见的布局1. 水平居中2. 垂直居中3. 水平垂直居中4. 等分布局5. 响应式布局6. 网格布局 常见的布局封装 display:flex;常用…...
golang函数传参——值传递理解
做了五年的go开发,却并没有什么成长,都停留在了业务层面了。一直以为golang中函数传参,如果传的是引用类型,则是以引用传递,造成这样的误解,实在也不能怪我。我们来看一个例子,众所周知…...
Liunx环境下git的详细使用(gitee版)
Liunx环境下git的详细使用(gitee版) 1.git是什么2.git操作2.1在gitee创建一个仓库2.2.gitignore2.3.git 3.git三板斧3.1add3.2 commit3.3push 4.git其他命令4.1查看当前仓库状态4.2查看提交日志4.3修改git里面文件名称4.4删除文件4.5修改远端仓库内容 1.…...
exoplayer的使用-2,与flutter相互通信
上一次解决的问题是ac3这些exoplayer本身不支持音频,添加了ffmpeg扩展实现软解码. 另一个问题是flutter端的内置字幕显示不了,也不打算再继续探讨了,换成native实现播放器.由于主项目是flutter的,所以涉及到了相互通信. 当前文章主要涉及到flutter与native相互通信功能 通信有…...
【基础类】—类型转换
一、数据类型 原始类型 Boolean、Null、Undefined、Number、String、Symbol 对象 Object 二、显示类型转换 Number函数, Number(param) 1-1. param 是 原始类型 时 数值:转换后还是原来的值 字符串:如果可以被解析…...
【云原生】 一文了解docker中的网络
文章目录 1.在Docker中,网络的实现方式是通过使用不同的网络驱动程序来实现的。2.桥接网络是默认网络。3.主机网络模式是不使用网络隔离的一种特殊模式。4.另一个有用的网络驱动程序是覆盖网络。5.最后,MACVLAN网络驱动程序允许多个容器与宿主机网卡的单独MAC地址和IP地址之间…...
嵌入式开发学习(STC51-15-红外遥控)
内容 使用外部中断功能,使按下红外遥控器,将对应键值编码数据解码后通过数码管显示 红外遥控介绍 红外线简介 人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫; 其中红光的波长范围为 0.62&…...
代码编辑器实践之vue-codemirror使用
前言 程序员用到IDE次数比较频繁,比如vscode、idea等,这些都是市场上比较流行的代码编辑器,拥有非常全面的功能。但是有时候在项目开发上也会用到代码编辑器,比如复杂的Array<Object>输入,或者需要用到用户交互…...
Mapstruct
1. Mapstruct介绍 1. 实体类之间对象映射中间件 2. 实体类相同结构属性自动对象映射 3. 实体类不同结构属性可以手动配置对象映射 2. Mapstruct基本使用 1. 定义一个接口或抽象类加Mapper(componentModel “spring”);spring:可以spring框架注入 2. 定义…...
初阶C语言——特别详细地介绍函数
系列文章目录 第一章 “C“浒传——初识C语言(更适合初学者体质哦!) 第二章 详细认识分支语句和循环语句以及他们的易错点 第三章 初阶C语言——特别详细地介绍函数 目录 系列文章目录 前言 一、函数是个什么鬼东西? 二、C语…...
pulsar-client-1-2 PulsarClient构造函数
前言 上文说到,PulsarClient通过链式调用构建,而在build()中调用了new PulsarClientImpl(conf),而Producer 本文通过解析构造函数,了解其主要结构。 // 创建PulsarClient PulsarClient client = PulsarClient.builder().serviceUrl("pulsar://localhost:6650")…...
原型链污染是什么
__proto__ 一个Foo类实例化出来的foo对象,可以通过foo.__proto__属性来访问Foo类的原型,也就是说: foo.__proto__ Foo.prototype 对象 构造函数 所以,总结一下: prototype是一个类的属性,所有…...
java之石头迷阵单击游戏、继承、接口、窗体、事件、组件、按钮、图片
文章目录 前言主方法实现类 前言 主方法和实现类在同一个包中。 主方法 package PSortGames;public class Main {public static void main(String[] args) {new MainFrame();} }实现类 package PSortGames;import javax.swing.*; import java.awt.event.KeyEvent; import jav…...
Debian 系列 Linux 的静态 DNS 、gateway 、IP 设置和网络重启
文章目录 DNS 设置DNS 配置文件DNS 配置文件内容 gateway、IP 设置网络适配器配置文件网络适配器配置文件内容 网络重启 各个 Linux 发行版的网络设置有很大不同。根据最近对 Debian 系列(含 Debian 12、基于 Debian 12 的Proxmox 8.0-2 以及基于Debian 11 的 openm…...
IP路由基础+OSPF 基础
IP路由 RIB与FIB RIB:Routing Information Base,路由信息库 ,路由器的控制平面 FIB:Forwarding Information Base,转发信息库,路由器的数据平面 路由信息库主要是记录直连路由以及协议宣告的路由信息&am…...
REPENTOGON全面安装指南:深度解锁以撒结合脚本扩展器功能
REPENTOGON全面安装指南:深度解锁以撒结合脚本扩展器功能 【免费下载链接】REPENTOGON Script extender for The Binding of Isaac: Repentance 项目地址: https://gitcode.com/gh_mirrors/re/REPENTOGON 想要为《以撒的结合:悔改》带来革命性的游…...
微生物网络分析参数配置与结果验证:microeco中SpiecEasi的进阶应用指南
微生物网络分析参数配置与结果验证:microeco中SpiecEasi的进阶应用指南 【免费下载链接】microeco An R package for data analysis in microbial community ecology 项目地址: https://gitcode.com/gh_mirrors/mi/microeco 在微生物生态学研究中,…...
直接上代码吧,咱们先用Python+OpenCV搞个帧间差法的Demo。看这段核心代码
基于帧间差法进行视频目标检测处理 【是仅源码的价格】 【可写完整课程设计文档报告】 需要或需要请随时联系,博主常在线能秒回 1.[1]视频目标检测: 视频目标检测是指从视频流中自动识别和提取出运动目标的过程 视频目标检测算法通常基于以下原理和方法&…...
AI赋能开发:让快马智能生成具备数据清洗与自然语言查询的行情网站
最近在做一个Python行情网站的项目,发现AI辅助开发真的能大幅提升效率。特别是数据清洗和自然语言处理这些传统上比较繁琐的部分,借助InsCode(快马)平台的AI能力,整个过程变得轻松多了。分享一下我的实践心得: 数据清洗自动化 行情…...
C++高性能网络库ZLToolKit资源池源码解析:如何用智能指针实现对象复用与自动回收
C高性能网络库ZLToolKit资源池源码解析:智能指针实现对象复用与自动回收 在C高性能服务器开发中,频繁的对象创建与销毁往往是性能瓶颈之一。想象一下这样的场景:一个直播服务器每秒需要处理数万条消息,每条消息都需要临时创建对象…...
深度解析猫抓浏览器扩展资源嗅探机制与性能优化策略
深度解析猫抓浏览器扩展资源嗅探机制与性能优化策略 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓(Cat Catch)作为一…...
VCNL4020 proximity与环境光传感器集成设计指南
1. VCNL4020传感器技术解析:面向嵌入式系统的 proximity 与环境光一体化解决方案VCNL4020 是 Vishay 公司推出的高集成度光学传感芯片,专为资源受限的嵌入式系统设计。其核心价值在于将红外发射器(IRED)、接近检测光电二极管、环境…...
告别单片机!用Multisim 10.0和74LS192芯片,手把手教你搭一个30秒倒计时器(附完整电路图)
数字电路实战:用Multisim与74LS192打造精准30秒倒计时器 在电子设计领域,倒计时器是一个经典而实用的项目。传统上,许多初学者会直接选择单片机方案,认为编程控制更为简单。但真正理解数字电路的工作原理,掌握硬件层面…...
告别重复造轮子:用快马AI为qclaw项目封装高效算法模板与优化工具
在量子计算领域,qclaw项目的开发往往需要处理大量重复性工作。每次从零开始编写量子算法不仅耗时耗力,还容易引入人为错误。最近我在开发一个量子化学模拟项目时,发现了一个能显著提升效率的方法——利用InsCode(快马)平台构建可复用的算法模…...
保姆级图解:ARM CHI协议里的Credit机制,到底是怎么防止芯片“堵车”的?
ARM CHI协议中的Credit机制:芯片互连的智能交通控制系统 想象一下早高峰时段的城市交通——如果没有红绿灯和匝道流量控制,整个道路系统将在几分钟内陷入瘫痪。类似地,在现代多核处理器和芯片间互连架构中,Credit机制正是扮演着这…...
