vue elementui el-table实现增加行,行内编辑修改

需求:

前端进行新增表单时,同时增加表单的明细数据。明细数据部分,可进行行编辑。

效果图:

javascript 复制代码
        <el-card>
          <div slot="header">
            <span style="font-weight: bold">外来人员名单2</span>
            <el-button
              style="float: right"
              type="primary"
              @click="insertDetailRow"
              >添加</el-button
            >
          </div>
          <el-table
            ref="detailTable"
            align="center"
            highlight-cell
            keep-source
            stripe
            border
            style="width: 100%"
            max-height="400"
            :data="detailTableData"
          >
            <el-table-column prop="userName" label="姓名" align="center">
              <template slot-scope="{ row, $index }">
                <span v-if="!showEdit[$index]">{{ row.userName }}</span>
                <el-input
                  v-model="detailTableData[$index].userName"
                  v-if="showEdit[$index]"
                  placeholder="请输入姓名"
                ></el-input>
              </template>
            </el-table-column>
            <el-table-column prop="sex" label="性别" align="center">
              <template slot-scope="{ row, $index }">
                <span v-if="!showEdit[$index]">{{ row.sex }}</span>
                <el-select
                  v-model="detailTableData[$index].sex"
                  v-if="showEdit[$index]"
                  placeholder="请选择性别"
                >
                  <el-option
                    v-for="item in sexs"
                    :label="item.label"
                    :value="item.value"
                  >
                  </el-option>
                </el-select>
              </template>
            </el-table-column>
            <el-table-column prop="telPhone" label="手机号" align="center">
              <template slot-scope="{ row, $index }">
                <span v-if="!showEdit[$index]">{{ row.telPhone }}</span>
                <el-input
                  v-model="detailTableData[$index].telPhone"
                  v-if="showEdit[$index]"
                  placeholder="请输入手机号"
                />
              </template>
            </el-table-column>
            <el-table-column label="操作" align="center" width="220">
              <template slot-scope="{ row, $index }">
                <el-button
                  v-if="!showEdit[$index]"
                  @click="editDetailRow($index, row)"
                  type="primary"
                  icon="el-icon-edit"
                  circle
                />
                <el-button
                  v-if="showEdit[$index]"
                  @click="confirmDetailRow($index, row)"
                  type="success"
                  icon="el-icon-check"
                  circle
                />
                <el-button
                  v-if="!showEdit[$index]"
                  @click="removeDetailRow($index, row)"
                  type="danger"
                  icon="el-icon-delete"
                  circle
                />
              </template>
            </el-table-column>
          </el-table>
        </el-card>

export default {
  data() {
    return {
      detailTableData: [],   
      showEdit: [], //控制显示及隐藏
      sexs: [{ label: '女', value: '女' }, { label: '男', value: '男' }]
    }
  },
  methods: {
    //添加一行
    insertDetailRow() {
      console.info(this.detailTableData)
      if (this.detailTableData != null && this.detailTableData.length > 0) {
        if (this.detailTableData[this.detailTableData.length - 1].userName === null ||
          this.detailTableData[this.detailTableData.length - 1].userName === undefined ||
          this.detailTableData[this.detailTableData.length - 1].userName.length <= 0) {
          this.$message({ type: 'error', message: '请将数据填写完整后再新增数据行!' })
          return false
        }
        //现有行取消编辑 
        this.detailTableData.forEach((ele, i) => {
          this.$set(this.showEdit, i, false)
        })
      }
      var obj = {
        userName: '',
        sex: '',
        telPhone: ''
      }
      this.detailTableData.push(obj)
    },
    // 编辑一行
    editDetailRow(index, row) {
      this.$set(this.showEdit, index, true)
    },
    // 确认编辑
    confirmDetailRow(index, row) {
      this.$set(this.showEdit, index, false)
    },
    //删除一行
    removeDetailRow(index, row) {
      this.$confirm('此操作将永久删除当前信息, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
        center: true
      })
        .then(() => {
          this.detailTableData.splice(index, 1)
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          })
        })
    }
  }
}
相关推荐
不会敲代码15 小时前
手写 Mini React:从 JSX 到虚拟 DOM 再到 render,搞懂 React 底层原理
前端·javascript·react.js
kyriewen7 小时前
你的代码仓库变成“毛线团”了?Monorepo 用 Turborepo 拆成“乐高积木”
前端·javascript·面试
身如柳絮随风扬7 小时前
你知道什么是 Ajax 吗?—— 从入门到原理,一篇彻底搞懂
前端·ajax·okhttp
旷世奇才李先生7 小时前
Vue3\+TypeScript 2026实战——企业级前端项目架构搭建与性能优化全指南
前端·架构·typescript
Beginner x_u8 小时前
前端八股整理(工程化 02)|CommonJS/ESM、Webpack Loader/Plugin 与Vite 对比
前端·webpack·node.js·plugin·loader
openKaka_8 小时前
createRoot 到底创建了什么:FiberRootNode 和 HostRootFiber 的初始化过程
前端·javascript·react.js
习明然8 小时前
UniApp开发体验感受总结
前端·uni-app
刀法如飞9 小时前
Claude Code Skills 推荐:2026年最值得安装的10个AI技能
前端·后端·ai编程
Lee川10 小时前
面试手写 KeepAlive:React 组件缓存的实现原理
前端·react.js·面试
墨染天姬10 小时前
【AI】cursor提示词小技巧
前端·数据库·人工智能