vue实现element自定义新增、删除table表格的行,和可输入input(可以自行修改成双击表格可编辑)

2023-11-10

效果如图:新增表格行,可点编辑再修改表格行内容(也可以自行修改成双击表格可编辑)

 思路:

1.新增表格行(handleAddBtn):给表格数组(我这里是用tableData数组)push空的对象
2.删除行(handleDeleteBtn):
①首先要拿到对应的索引,即可以用表格的@selection-change="handleDetailSelectionChange"获取勾选的行;
②然后在删除的方法里判断用户勾选选择行的长度(我这里是用checkedDetail数组存储),长度若为0则表示没有选择,为了增加用户体验感给予提示即可;若长度大于0,遍历checkedDetail与tableData作比较(xh属性)相同的删除即可
3.可编辑行(showUpdate):拿到对应的索引并令其显示(this.showEdit[index] = true;网上说要用 $ set方法,否则页面状态不更新)
4.取消编辑(cancelUpdate):拿到对应的索引并令其隐藏(this.showEdit[index] = false;)

 

1、点击新增table表格行

添加点击事件,在handleAddBtn方法中创建表格对象(由于我表格数据太多,就删除了大部分,照样子模仿就行)

<el-button type="success" icon="el-icon-plus" size="mini" @click="handleAddBtn">添加</el-button>
//点击新增更多
handleAddBtn() {
  this.getaddress = "";	//临时存储用户地址
  et obj = {};	//创建空的对象
  obj.username = "";	//用户名称
  obj.mescode = "";	//账号
  obj.address = "";	//地址
  this.tableData.push(obj);	//在tableData表格数组中添加对象
}

2、点击删除行,可多选

添加删除点击事件,handleDeleteBtn方法把对应多选选中的行删除

<el-button type="danger" icon="el-icon-delete" size="mini" @click="handleDeleteBtn">删除</el-button>
//删除
        handleDeleteBtn() {
            if (this.checkedDetail.length == 0) {
                this.$alert("请先选择要删除的数据", "提示", {
                    confirmButtonText: "确定",
                });
            } else {
                this.$confirm("请是否确认删除该属性?", "提示", {
                    confirmButtonText: "确定",
                    cancelButtonText: "取消",
                    type: "warning",
                    callback: (action) => {
                        if (action === "confirm") {
                            let val = this.checkedDetail; //checkedDetail为表格多选选中的数组
                            val.forEach((val, index) => {
                                this.tableData.forEach((v, i) => {
                                    if (val.xh === v.xh) {
                                        this.tableData.splice(i, 1);
                                    }
                                });
                            });
                            this.$message({
                                message: "删除成功,记得保存修改喔!",
                                type: "success",
                            });
                            this.$refs.tb.clearSelection();
                            return;
                        } else {
                            this.$message({
                                message: "已取消删除操作",
                                type: "warning",
                            });
                            return;
                        }
                    },
                });
            }
        }

3.操作部分的编辑、确定、取消功能

这里的行需要拿到对应的index值,所以需要用slot-scope=“{row,$index}”;
showEdit是个空数组,用来控制对应的标签显示及隐藏的;
这里使用this. $set() 方法将对应索引的行改成true或false

<el-table-column header-align="center" align="center" width="100" label="操作">
    <template slot-scope="{row,$index}">	
         <el-button v-if="!showEdit[$index]" @click="showUpdate($index,row)" type="text" size="small">编辑</el-button>
         <el-button v-if="showEdit[$index]" @click="submit($index,row)" type="text" size="small" style="color: #85ce61;">确定</el-button>
         <el-button v-if="showEdit[$index]" @click="cancelUpdate($index)" type="text" size="small" style="color: red;">取消</el-button>
    </template>
</el-table-column>
//点击修改
        showUpdate(index, row) {
            console.log("index");
            this.showEdit[index] = true;	
            this.$set(this.showEdit, index, true); //这里要用$set方法,否则页面状态不更新
        },
        //提交修改
        submit(index, row) {
            console.log("index", index);
            this.tableData[index].address = this.getaddress.adrNAME;
            // this.tableData[index].username = this.getUser.label;
            console.log("tableData===submit", this.tableData);

            //发送请求,隐藏输入框
            this.$message({
                type: "success",
                message: "已缓存,记得点击保存提交修改喔!",
                duration: 888,
                onClose: () => {
                    this.$set(this.showEdit, index, false); //vue添加属性的方法
                },
            });
        },
        //取消修改
        cancelUpdate(index) {
            this.$confirm("取消修改?", "提示", {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning",
            })
                .then(() => {
                    this.$set(this.showEdit, index, false);
                })
                .catch(() => {});
        }

完整代码:

<!-- 可新增/删除table表格页面 -->
<template>
  <div>
    <el-button type="success" icon="el-icon-plus" size="mini" @click="handleAddBtn">添加</el-button>
    <el-button type="danger" icon="el-icon-delete" size="mini" @click="handleDeleteBtn">删除</el-button>

    <el-table ref="tb" :data="tableData" :header-cell-style="{background:'rgb(113 167 228)',color:'#fff'}" :row-class-name="rowClassName" border style="width: 100%; cursor: pointer;" @selection-change="handleDetailSelectionChange">
      <el-table-column type="selection" align="center" width="50" />
      <el-table-column label="序号" align="center" prop="xh" width="50" />

      <el-table-column prop="mescode" align="center" :required="true" label="账号">
        <template slot-scope="{row,$index}">
          <span v-if="!showEdit[$index]">{{ row.mescode }}</span>
          <el-input v-if="showEdit[$index]" v-model="tableData[row.xh-1].mescode" placeholder="请输入该用户的账号">
            <i slot="prefix" class="el-input__icon el-icon-search" />
          </el-input>
        </template>
      </el-table-column>
      <el-table-column prop="password" align="center" :required="true" label="密码">
        <template slot-scope="{row,$index}">
          <span v-if="!showEdit[$index]">{{ row.password }}</span>
          <el-input v-if="showEdit[$index]" v-model="tableData[row.xh-1].password" placeholder="请输入该用户的密码">
            <i slot="prefix" class="el-input__icon el-icon-search" />
          </el-input>
        </template>
      </el-table-column>
      <el-table-column header-align="center" align="center" width="100" label="操作">
        <template slot-scope="{row,$index}">
          <el-button v-if="!showEdit[$index]" type="text" size="small" @click="showUpdate($index,row)">编辑</el-button>
          <el-button v-if="showEdit[$index]" type="text" size="small" style="color: #85ce61;" @click="submit($index,row)">确定</el-button>
          <el-button v-if="showEdit[$index]" type="text" size="small" style="color: red;" @click="cancelUpdate($index)">取消</el-button>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  components: {},
  data() {
    return {
      tableData: [],
      checkedDetail: [],
      showEdit: [] // 控制显示及隐藏
    }
  },
  methods: {
    // 表格的新增
    rowClassName({ row, rowIndex }) {
      row.xh = rowIndex + 1
    },
    // 单选框选中数据
    handleDetailSelectionChange(selection) {
      this.checkedDetail = selection
    },
    // 点击新增更多
    handleAddBtn() {
      const obj = {}
      obj.mescode = ''
      obj.password = ''
      this.tableData.push(obj)
    },
    // 删除
    handleDeleteBtn() {
      if (this.checkedDetail.length === 0) {
        this.$alert('请先选择要删除的数据', '提示', {
          confirmButtonText: '确定'
        })
      } else {
        this.$confirm('请是否确认删除该属性?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning',
          callback: (action) => {
            if (action === 'confirm') {
              const val = this.checkedDetail
              val.forEach((val, index) => {
                this.tableData.forEach((v, i) => {
                  if (val.xh === v.xh) {
                    this.tableData.splice(i, 1)
                  }
                })
              })
              this.$message({
                message: '删除成功,记得保存修改喔!',
                type: 'success'
              })
              this.$refs.tb.clearSelection()
              return
            } else {
              this.$message({
                message: '已取消删除操作',
                type: 'warning'
              })
              return
            }
          }
        })
      }
    },
    // 点击修改
    showUpdate(index, row) {
      console.log('index')
      this.showEdit[index] = true
      this.$set(this.showEdit, index, true) // 这里要用$set方法,否则页面状态不更新
    },
    // 取消修改
    cancelUpdate(index) {
      this.$confirm('取消修改?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          this.$set(this.showEdit, index, false)
        })
        .catch(() => {})
    },
    // 提交修改
    submit(index, row) {
      // 发送请求,隐藏输入框
      this.$message({
        type: 'success',
        message: '已缓存,记得点击保存提交修改喔!',
        duration: 888,
        onClose: () => {
          this.$set(this.showEdit, index, false) // vue添加属性的方法
        }
      })
    }
  }
}
</script>
<style>
</style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue实现element自定义新增、删除table表格的行,和可输入input(可以自行修改成双击表格可编辑) 的相关文章

随机推荐

  • git分支切换

    在git中 可利用checkout命令转换分支 该命令的作用就是切换分支或恢复工作树文件 语法为 git checkout 分支名 当参数设置为 b 时 可以在新分支创建的同时切换分支 语法为 git checkout b 分支名 本文操作
  • 计及源-荷双重不确定性的虚拟电厂/微网日前随机优化调度

    目录 1主要内容 1 1 场景生成及缩减 1 2 随机优化调度 2 程序链接 1主要内容 程序主要做的是一个虚拟电厂或者微网单元的日前优化调度模型 考虑了光伏出力和负荷功率的双重不确定性 采用随机规划法处理不确定性变量 构建了虚拟电厂随机优
  • 计算机端口详解(总结)

    计算机端口详解 总结 https blog csdn net qq 17204441 article details 89063083 0x00 什么是端口 0x01 端口的分类 0x02 端口在入侵中的作用 0x03 端口的相关工具 0x
  • 第十届蓝桥杯 JavaA 迷宫

    第十届蓝桥杯 JavaA 迷宫 法一 思路 bfs path记录路径 1 编程https www cnblogs com woxiaosade p 10592061 html 2 观察https www cnblogs com yzm10
  • Hypertable 和 chunk 超表和块

    文档 https docs timescale com v0 9 introduction architecture 概述 TimescaleDB作为PostgreSQL的扩展实现 这意味着Timescale数据库在整个PostgreSQL
  • selenium+chormdriver+python 实现淘宝的信息爬取

    因为我是个爬虫新手 所以对爬虫还不熟练 这几天想着自己做一个淘宝信息的自动爬取 一开始感觉比较简单 但做到了登录界面 发现一直被网站检测出来 不能滑动滑块 接下来从网上翻遍了资料 整理了以下自己的代码 完成了这个艰难的工程 嘻嘻 对我来说
  • Rsync远程同步

    rsync rsync Remote Sync 远程同步 是一个开源的快速备份工具 可以在不同主机之间镜像同步整个目录树 支持增量备份 并保持链接和权限 且采用优化的同步算法 传输前执行压缩 因此非常适用于异地备份 镜像服务器等应用 rsy
  • MFC中设置焦点

    初次接触MFC 实现填完一系列表单后继续添加另外一张 并且将焦点设置为第一张初次填写时的焦点 可能就是指第一个获取焦点的控件 用 SetFocus m hWnd 实现重置表单的功能 UpdateData FALSE 更新数据时是 Updat
  • 【Docker】Docker的使用案例以及未来发展、Docker Hub 服务、环境安全的详细讲解

    Docker的工具实践及root概念和Docker容器安全性设置 1 使用案例 2 Docker解决的问题 3 Docker未来发展 4 Docker Hub 服务 5 技术局限 6 Docker环境安全 7 容器部署安全 1 使用案例 D
  • 希腊字母发音对照表及其latex命令

    拉丁字母是26个 希腊 Greek 字母是24个 发音即是它们各自的latex形式 大写字母的是其小写latex首字母大写后的形式 如 Delta Delta notation 西方的数学家们在推导数学定理时 仍然沿用并不好写也不好记的希腊
  • ArcGIS 文本数字写入csv文件后小数点位数减少

    在将经纬度数据写入csv文件的过程中 经度和纬度都是以小数点后保留4为小数的字符串形式存储的 但是在转成csv文件后 打开发现小数点位数缺失了 如图 在网上找了好久也没有找到解决办法 大部分都是解决文本数字过长导致以有效数字形式显示的问题
  • 如何有效的防护DDoS攻击

    DDoS攻击的类型和方法 分布式拒绝服务攻击 简称DDoS 是一种协同攻击 旨在使受害者的资源无法使用 它可以由一个黑客组织协同行动 也可以借助连接到互联网的多个受破坏设备来执行 这些在攻击者控制下的设备通常称为僵尸网络 有多种执行DDoS
  • stm32通用外部spi下载算法实现

    参考硬汉嵌入式 实战技能 任何支持SWD接口的单片机都可以方便移植的SPI Flash烧写算法制作 哔哩哔哩 bilibili 该up主提供的stm32H7的模板工程 目前需求是实现基于正点原子探索者stm32f407zet6 W25Q12
  • SpringMVC上传文件的 4 种方式,你都会么?

    1 本文内容 文件上传开发步骤 单文件上传 多文件上传 通过 MultipartHttpServletRequest 处理文件上传 通过自定义对象接收上传的文件 扩展知识 案例代码 2 预备知识 springmvc 系列中的测试案例 基本上
  • 智能汽车竞赛室外光电 组 1 安装ROS软件平台和运行第一个程序

    机器人操作系统 ROS 对机器人进行编程以使其完全符合在工业环境中的要求 它的工具 库和共享的开放资源 允许开发人员协同工作 利用现有工作的优势 简化和加快创建机器人行为的过程 ROS得到了一个庞大的全球社区的支持 其邮件列表 Wiki和R
  • [从零开始学DeepFaceLab-21]: 使用-命令行八大操作步骤-第6步:模型的选择与训练 - 进阶 - AMP模型训练参数详解与优化

    目录 前言 第1章 AMP模型训练参数详解 1 1 AMP参数汇总 1 2 参数详解
  • AOP实现企业级API访问接口监控(通过Google Guava缓存数据)

    开发了企业的功能模块 分享给大家参考 若大家看到我的实现有不足之处或有自己的见解欢迎评论区分享 学习去咯 文章目录 前言 一 AOP的基本知识 1 什么是AOP 2 有哪些AOP的概念 3 AOP包含的几个概念 4 AOP 有哪些应用场景
  • QT打开文件及文件路径

    获取文件夹路径 static QString getExistingDirectory QWidget parent Q NULLPTR const QString caption QString const QString dir QSt
  • Android NDK添加NEON以及cpufeatures支持

    本人使用Android studio3 0进行NDK开发 由于Android develop官网文档是针对2 2版本以下 这里为2 2以上版本的cmakelist配置做以下纪录 一 添加NEON支持 在build gradle app 中添
  • vue实现element自定义新增、删除table表格的行,和可输入input(可以自行修改成双击表格可编辑)

    效果如图 新增表格行 可点编辑再修改表格行内容 也可以自行修改成双击表格可编辑 思路 1 新增表格行 handleAddBtn 给表格数组 我这里是用tableData数组 push空的对象 2 删除行 handleDeleteBtn 首先