Element UI 在Table里进行直接新增和修改

最近做的一个项目,要求新增和修改不要用弹出框的形式,而是希望可以直接再表格中进行添加修改,作为后端的我,一脸懵逼,后来查看文档,总结如下,以便学习。

最终效果如下:

直接上代码:

前端:

 1、三个按钮,新增、保存、批量新增的按钮:

    <el-row class="mb20" style="font-weight: bold">费用明细</el-row>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="primary"
          plain
          icon="el-icon-plus"
          @click="addLine()"
          size="mini"
          v-hasPermi="['detail:bill:add']"
        >新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="success"
          plain
          icon="el-icon-circle-check"
          @click="insertSaveAll()"
          size="mini"
          v-hasPermi="['detail:bill:save']"
        >保存</el-button>
      </el-col>
      <el-col :span="1.5">
          <el-button
            type="info"
            plain
            icon="el-icon-circle-check"
            @click="batchInsert()"
            size="mini"
            v-hasPermi="['detail:bill:batchAdd']"
          >批量新增</el-button>
      </el-col>
    </el-row>

2、表格的代码块,其中的showInput是后端返回的,前端也尝试过添加到返回集中,但是有问题,所以还是在后端新增了一个字段,比较好处理 。

<el-table v-loading="loading" :data="detailList"  border>
      <el-table-column label="费用分类" align="center" >
        <template slot-scope="scope">
            <el-select v-if="scope.row.showInput" filterable clearable v-model="scope.row.typeId" @change="getFreeTwo(scope.row.typeId)" placeholder="请选择费用分类">
              <el-option
                v-for="item in freeTypeOne"
                :key="item.id"
                :label="item.name"
                :value="item.id">
              </el-option>
            </el-select>
            <span v-else>{{scope.row.typeName}}</span>
        </template>
      </el-table-column>
      <el-table-column label="费用类型" align="center" >
        <template slot-scope="scope">
          <el-select v-if="scope.row.showInput" filterable clearable v-model="scope.row.parentId" @change="getSelectItem(scope.row.parentId)" placeholder="请选择费用类型">
              <el-option
                v-for="item in freeTypeTwo"
                :key="item.id"
                :label="item.name"
                :value="item.id">
              </el-option>
          </el-select>
          <span v-else>{{scope.row.parentName}}</span>
        </template>
      </el-table-column>
      <el-table-column label="费用项" align="center" >
        <template slot-scope="scope">
          <el-select v-if="scope.row.showInput" filterable clearable v-model="scope.row.freeItemId" placeholder="请选择费用项">
                <el-option
                  v-for="item in freeTypeThree"
                  :key="item.id"
                  :label="item.name"
                  :value="item.id">
                </el-option>
          </el-select>
          <span v-else>{{scope.row.freeItemName}}</span>
        </template>
      </el-table-column>
      <el-table-column label="项目订单" align="center" >
        <template slot-scope="scope">
          <el-select v-if="scope.row.showInput" filterable clearable v-model="scope.row.projectId" placeholder="请选择项目订单">
                <el-option
                  v-for="item in projectList"
                  :key="item.id"
                  :label="item.name"
                  :value="item.id">
                </el-option>
          </el-select>
          <span v-else>{{scope.row.projectName}}</span>
        </template>
      </el-table-column>
      <el-table-column label="预算金额" min-width="100" align="center" prop="budgetAmount" >
        <template slot-scope="scope">
            <input v-if="scope.row.showInput" type="number" v-model="scope.row.budgetAmount"  />
            <span v-else>{{scope.row.budgetAmount}}</span>
        </template>
      </el-table-column>
      <el-table-column label="实际金额" min-width="100" align="center" prop="actualAmount" >
        <template slot-scope="scope">
            <input v-if="scope.row.showInput" type="number" v-model="scope.row.actualAmount"  />
            <span v-else>{{scope.row.actualAmount}}</span>
        </template>
      </el-table-column>
      <el-table-column label="备注" min-width="100" align="center" prop="remark" >
        <template slot-scope="scope">
            <input  v-if="scope.row.showInput" type="text" v-model="scope.row.remark"  />
            <span v-else>{{scope.row.remark}}</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleUpdate(scope.row)"
            v-hasPermi="['detail:bill:edit']"
          >修改</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-delete"
            @click="handleDelete(scope.row)"
            v-hasPermi="['detail:bill:remove']"
          >删除</el-button>
        </template>
      </el-table-column>
    </el-table>

3、定义后端返回的表格数据

// 在data里面维护单据数据
billData:{},
// 在data里定义 行 数据,用于当作Id,删除的时候用
i:1,

// 在methods里实现点击新增按钮新增一条数据
methods: {

    /* 新增一行 */
    addLine(){
      this.detailList.push({
          line:++this.i,
          showInput:true
      })
    },

}

4、修改按钮

/** 修改按钮操作 */
handleUpdate(row) {
   row.showInput = true;
},

5、保存按钮

/* 保存所有 */
    insertSaveAll(){
      saveAll({
        mapList:this.detailList
      }).then(response => {
          this.$modal.msgSuccess("新增成功");
          this.open = false;
          this.getList();
      });
    },

6、删除按钮

/** 删除按钮操作 */
    handleDelete(row) {
      console.log(row)
      var ids = row.id;
      if(ids == "" || ids == null || ids == undefined ){
        return this.detailList =  this.detailList.filter(x => x.line !=row.line);
      }
      this.$modal.confirm('是否确认删除该数据项?').then(function() {
        return delDetail([ids]);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
      }).catch(() => {});
    },

7、查询表格数据

/** 查询费用明细列表 */
    getList() {
      this.loading = true;
      listDetail(this.queryParams).then(response => {
        this.detailList = response.rows;
        this.total = response.total;
        this.loading = false;
      });
    },

java后端:

@GetMapping("/list") public TableDataInfo list(@RequestParam Long pageSize, @RequestParam Long pageNum,TbBillDetail tbBillDetail) { startPage(); List<TbBillDetail> list = tbBillDetailService.selectTbBillDetailList(tbBillDetail); return getDataTable(list); }
 @Override
    public List<TbBillDetail> selectTbBillDetailList(TbBillDetail tbBillDetail) {
        List<TbBillDetail> details = tbBillDetailMapper.selectTbBillDetailList(tbBillDetail);
        if (ObjectUtil.isNotNull(details)) {
            details.forEach(d -> {
                d.setShowInput(false);
            });
        }
        return details;
    }

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
element-ui中的`<el-table>`组件可以使用插槽(slot)来实现在表格内部新增数据的功能。你可以在`<el-table>`中定义一个`<template>`标签,并使用`<el-form>`组件来创建表单,然后在表格中使用`<el-table-column>`来渲染表单中的每个字段。当用户填写完表单并点击保存按钮时,你可以将表单数据添加到表格数据中。 以下是一个示例代码: ```vue <template> <div> <el-table :data="tableData"> <el-table-column prop="name" label="Name"></el-table-column> <el-table-column prop="age" label="Age"></el-table-column> <el-table-column prop="gender" label="Gender"></el-table-column> <el-table-column> <template slot-scope="scope"> <el-button @click="editRow(scope.row)">Edit</el-button> <el-button @click="deleteRow(scope.$index)">Delete</el-button> </template> </el-table-column> </el-table> <el-dialog :visible.sync="dialogVisible"> <el-form :model="form" label-width="80px"> <el-form-item label="Name"> <el-input v-model="form.name"></el-input> </el-form-item> <el-form-item label="Age"> <el-input v-model.number="form.age"></el-input> </el-form-item> <el-form-item label="Gender"> <el-radio-group v-model="form.gender"> <el-radio label="Male">Male</el-radio> <el-radio label="Female">Female</el-radio> </el-radio-group> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">Cancel</el-button> <el-button type="primary" @click="saveRow">Save</el-button> </div> </el-dialog> <el-button type="primary" @click="addRow">Add Row</el-button> </div> </template> <script> export default { data() { return { tableData: [ { name: 'John Doe', age: 25, gender: 'Male' }, { name: 'Jane Doe', age: 30, gender: 'Female' }, ], dialogVisible: false, form: { name: '', age: '', gender: '', }, rowIndex: null, }; }, methods: { addRow() { this.rowIndex = null; this.dialogVisible = true; this.form = { name: '', age: '', gender: '', }; }, editRow(row) { this.rowIndex = this.tableData.indexOf(row); this.dialogVisible = true; this.form = Object.assign({}, row); }, deleteRow(index) { this.tableData.splice(index, 1); }, saveRow() { if (this.rowIndex !== null) { Object.assign(this.tableData[this.rowIndex], this.form); } else { this.tableData.push(this.form); } this.dialogVisible = false; }, }, }; </script> ``` 在这个示例中,我们使用了一个对话框(dialog)来显示表单。当用户点击“Add Row”按钮时,我们打开对话框并清空表单数据。当用户点击表格中的“Edit”按钮时,我们将表格行的数据复制到表单中并打开对话框。当用户保存表单时,我们将表单数据添加到表格数据中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值