当前位置: 首页 > news >正文

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

效果

动画

完整代码见文末

实现思路

  1. 使用两个表单分别用于实现修改和新增处理。

  2. 通过一个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
    }
    
  3. 通过隐藏表头实现新增表格和修改表格的合并,同时表格数据只有addRow

    <el-table :data="[addRow]" :show-header="false">...
    </el-table>
    

实现细节讲解

  1. 当无数据时只展示新增行:

    image-20230801162740429

    通过设置以下样式即可:

    /deep/ .el-table__empty-block {display: none;
    }
    
  2. 新增或者修改数据行时增加行高用于显示校验信息:

    动画

    行高通过以下样式进行控制,不处于新增或者修改状态时设置为 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>
http://www.lryc.cn/news/111103.html

相关文章:

  • 中介者模式——协调多个对象之间的交互
  • 启动Flink显示初始化状态怎么解决?
  • VB+SQL采购管理系统设计与实现
  • TBB库中实现协程(coroutine)的源码说明
  • 【CSS弹性盒模型 display:flex;常用参数及常见的布局】
  • golang函数传参——值传递理解
  • Liunx环境下git的详细使用(gitee版)
  • exoplayer的使用-2,与flutter相互通信
  • 【基础类】—类型转换
  • 【云原生】 一文了解docker中的网络
  • 嵌入式开发学习(STC51-15-红外遥控)
  • 代码编辑器实践之vue-codemirror使用
  • Mapstruct
  • 初阶C语言——特别详细地介绍函数
  • pulsar-client-1-2 PulsarClient构造函数
  • 原型链污染是什么
  • java之石头迷阵单击游戏、继承、接口、窗体、事件、组件、按钮、图片
  • Debian 系列 Linux 的静态 DNS 、gateway 、IP 设置和网络重启
  • IP路由基础+OSPF 基础
  • window远程连接Linux
  • MyBatis 查询数据库之二(增、删、改、查操作)
  • unraid docker桥接模式打不开页面,主机模式正常
  • 第七章:进程间通信(IPC)——构成进程间通信的信道方案
  • 部分常用CSS样式
  • 思科单臂路由、lacp链路聚合、NAT实验
  • 【力扣每日一题】2023.8.5 合并两个有序链表
  • QT 驱动条码打印机(没有验证过)
  • Kafka介绍
  • Django使用uwsgi+nginx部署,admin没有样式解决办法
  • 穷举深搜暴搜回溯剪枝(3)