vue2实践:el-table实现由用户自己添加删除行数的动态表格

需求

项目中需要提供一个动态表单,如图:

当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。

至少要有一行数据,但是没有上限。

思路

这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是:

1、table里面的每一个cell,需要放置一个input来支持用户编辑。

2、最后一列放置两个button,响应用户添加或删除行的需求

实现

data

javascript 复制代码
managerList:[{
   userId:undefined,
   nickName:undefined,
   phonenumber:undefined
}],

template

因为要求至少有一行数据,所以删除按钮增加一个判断,v-if="managerList.length > 1",当只剩一行数据时,删除按钮隐藏,不允许再点击

html 复制代码
<el-table :data="managerList">        
        <el-table-column label="姓名" align="center" prop="nickName">
          <template slot-scope="scope">
            <el-input v-model.trim="scope.row.nickName" placeholder="请输入项目经理姓名"/>
          </template>
        </el-table-column>
        <el-table-column label="电话号码" align="center" prop="phonenumber">
          <template slot-scope="scope">
            <el-input v-model.trim="scope.row.phonenumber" placeholder="请输入电话号码"/>
          </template>
        </el-table-column>
        <el-table-column label="操作" align="center" prop="status">
          <template slot-scope="scope">
            <el-link type="primary" icon="el-icon-plus" :underline="false" @click="addRow">新增</el-link>
            <el-link type="primary" icon="el-icon-delete-solid" :underline="false" @click="deleteRow(scope.$index,scope.row)"
                     v-if="managerList.length > 1">删除</el-link>
          </template>
        </el-table-column>
      </el-table>

methods

input不需要特殊处理。但是两个按钮要响应用户操作:

新增

当点击新增时,希望增加一行。基于Vue的响应式原理,data中的managerList数组增加一项即可,使用managerList.push;

javascript 复制代码
addRow(){
      let manager = {
        userId:undefined,
        nickName: undefined,
        phonenumber: undefined
      };
      this.managerList.push(manager);
},

删除

当点击删除时,希望减少一行,同理,managerList中该行数据删除:

javascript 复制代码
deleteRow(index,row){
      this.managerList.splice(index, 1);
},

如果这里全部都是新增数据,这样就可以了,但是,如果其中有初始数据,而删除的数据又是初始数据的话,需要记录哪个数据要被删除,以便保存时进行真正的数据删除

javascript 复制代码
deleteRow(index,row){
      this.managerList.splice(index, 1);

      //获取被删除的用户id,以便保存时将账户状态置为禁用
      if(row.userId != "" && row.userId != undefined){
        this.delUsers.push(row);
      }
},

数据校验

javascript 复制代码
validateInput(){
      for (let i = 0; i < this.managerList.length; i++) {
        this.managerList[i].nickName = this.managerList[i].nickName.trim();
        if (this.managerList[i].nickName === undefined || this.managerList[i].nickName === ""
          || this.managerList[i].nickName === null
          || this.managerList[i].phonenumber === undefined || this.managerList[i].phonenumber === "" ||
          this.managerList[i].phonenumber === null) {
          this.msgError(`第 ${i + 1} 项姓名或手机号码不能为空`);
          return false;
        }
        const regex = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/;
        if (!regex.test(this.managerList[i].phonenumber)) {
          this.msgError(`第 ${i + 1} 项电话号码格式错误`);
          return false;
        }
        //判断重复项
        for (let j = 0; j < i; j++) {
          if (this.managerList[j].nickName === this.managerList[i].nickName &&
            this.managerList[j].phonenumber === this.managerList[i].phonenumber) {
            this.msgError(`第 ${i + 1} 项"${this.managerList[i].nickName}"重复添加`);
            return false;
          }
        }
      }
      return true;
    },

保存

javascript 复制代码
submitManagerList(){
      if(this.validateInput()){
        this.removeManagers();
        this.addOrUpdateManagers();        
      }
},

至此,可以由用户自己控制行数的动态表格就完成了。

相关推荐
程序员黑豆1 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
剪刀石头布啊1 小时前
antd中可编辑表格中巧用useWatch实现联动高性能效果,以及定制延伸学习
前端
油丶酸萝卜别吃2 小时前
前端转全栈学习路线
前端·学习
浮生望2 小时前
前端路由进阶:History API原理与手写HistoryRouter
前端
陆枫Larry2 小时前
JavaScript 中的竞态是什么,为啥会有竟态?
前端
上海安当技术4 小时前
半天接入:USBKey RESTful API + C 动态库,Web 和 C/S 两套集成路径实战
前端·后端·restful·集成·usbkey
DevUI团队5 小时前
从“即兴创作”到“规格先行”,华为云码道(CodeArts)代码智能体持续深耕企业级规范驱动开发能力
前端·人工智能·后端
weixin_431600446 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js
avi91116 小时前
[AI教做人]AI平台做2项目;一个3D模型展示,另一个框架多人
javascript·人工智能·ai·3d模型·3d引擎·顶点和法线
kyriewen6 小时前
我用Claude Code两天干完了团队两周的排期——周报发出去那一刻我就后悔了
前端·javascript·ai编程