动态增删表格

期望目标:实现一个能通过按钮来动态增加表格栏,每次能添加一行,每行末尾有一个删减按钮。

复制代码
<el-button type="text" class="primary"
         @click="addMember()">+添加</el-button>
<el-table
        :data="memberList"
        style="width: 100%"
        :header-cell-style="{
          background: '#fafafa',
          color: '#aaa',
          fontSize: '15px',
      }"
      >
        <el-table-column prop="index" label="序号" width="60">
          <template slot-scope="scope">
            <span>{{ getMemberIndex(scope.$index) }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="facilityName" label="设施名称">
          <template slot-scope="scope">
            <el-select v-model="scope.row.facilityName" placeholder="请选择名称" clearable>
              <el-option v-for="dict in dict.type.data_facilities_name" :label="dict.label" :value="dict.value"  />
            </el-select>
          </template>
        </el-table-column>
        <el-table-column prop="facilitySpecificType" label="具体类型">
          <template slot-scope="scope">
            <el-select v-model="scope.row.facilitySpecificType" placeholder="请选择类型" clearable>
              <el-option v-for="dict in dict.type.data_facilities_type" :label="dict.label" :value="dict.value"/>
            </el-select>
          </template>
        </el-table-column>
        <el-table-column prop="facilityLocation" label="设施位置">
          <template slot-scope="scope">
            <el-select v-model="scope.row.facilityLocation" placeholder="请选择位置" clearable>
              <el-option v-for="dict in dict.type.data_equipment_location" :label="dict.label" :value="dict.value"/>
            </el-select>
          </template>
        </el-table-column>
        <el-table-column prop="facilityTp" label="规格">
          <template slot-scope="scope">
            <el-input v-model="scope.row.facilityTp"></el-input>
          </template>
        </el-table-column>
        <el-table-column prop="accountabilityUnit" label="责任单位">
          <template slot-scope="scope">
            <el-input v-model="scope.row.accountabilityUnit"></el-input>
          </template>
        </el-table-column>
        <el-table-column label="操作">
          <template slot-scope="scope">
            <el-button
              size="mini"
              type="text"
              icon="el-icon-delete"
              @click="handleDelete(scope.$index,'memberList')"
            >删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>

// 添加杆件数据按钮
    addMember() {
      var member = {
        index: this.dataId++,
        facilityNo: '',
        facilityName: '',
        facilitySpecificType: '',
        facilityLocation: '',
        facilityTp: '',
        accountabilityUnit: '',
      };
      this.memberList.push(member);
    },

效果:

遇到的问题一:在删减时,当前所有行的序号需要自动删减,重新计算变更序号

复制代码
// 删除行数据后序号自动连贯更新
    getMemberIndex(index) {
      return this.memberList.slice(0, index + 1).length ;
    },
/** 删除按钮操作 */
    handleDelete(index, listName) {
      if (index !== -1 && listName =="memberList") {
        this.memberList.splice(index, 1)
      }
    },

给序号那一栏字段单独重设,动态变更index,<span>{{ getMemberIndex(scope.$index) }}</span>,每次删除一行,调用handleDelete函数,再用getMember重新计算一遍所有序号

如果有数据验证的需求,就需要在table外面再嵌套一层form,因为只有el-form表单猜有数据验证的功能。

<el-form :model="memberForm" :rules="rules" ref="memberForm"></el-form>

问题二:

多个表单同时用一个接口提交,在提交数据表单时,后端要求有特殊的数据结构,需要将获取到的多个表单数据重新按要求整合。新设立一个json字段存储

复制代码
/** 提交按钮 */
    async submitForms() {
      // 构建数据结构
      const facilitiesData = {
        pointId: this.pointForm.pointId,
        pointName: this.pointForm.pointName,
        memberList: this.memberList.map(member => ({
          facilityName: member.facilityName,
          facilitySpecificType: member.facilitySpecificType,
          facilityLocation: member.facilityLocation,
          facilityTp: member.facilityTp,
          accountabilityUnit: member.accountabilityUnit,
        })),
      }
      // 发送请求添加设施
      await addFacilities(facilitiesData).then(response => {
        this.$modal.msgSuccess("新增成功");
        this.goBack();
      })
    },
相关推荐
顽疲15 分钟前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
DevUp17 分钟前
标着 JavaScript 的 Wiki 与知识库:既不是 CMS 也不是 SSG(番外三)
javascript·node.js·cms
kyriewen24 分钟前
我上手了 Vite+ 1.0:Node 不用自己装,lint 却翻车了
前端·javascript·程序员
鹏多多1 小时前
前端是如何死去的?| 完整时间线
前端·javascript·程序员
毕业设计7032 小时前
(免费领源码)基于node的学生公寓管理系统06412- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
vue.js·mysql·node.js·maven·mybatis·express·b/s
古夕2 小时前
iframe 授权失败时露出 60000 JSON 的复盘
前端·javascript
古夕2 小时前
地址变了,页面是空的:一次 Vue Router 菜单切换复盘
前端·vue.js
程序员Sunday2 小时前
ES Module 和 CommonJS 有什么区别?循环依赖时会发生什么?
前端·javascript·面试
有味道的男人3 小时前
搜好货平台关键词商品搜索接口:分页容错与商品数据轻量化提取方案
服务器·前端·javascript
雪雪爱冲浪6 小时前
JavaScript 网络爬虫教程(2026)
开发语言·javascript·爬虫