vue el-table 动态添加行与删除行的实现

目录
  • el-table 动态添加行与删除行
  • el-table 合计行放在首行
    • 首先在el-table ,添加属性
    • 2.定义合计行的位置和样式
    • 3. 合计行的数据

el-table 动态添加行与删除行

项目中有需要动态添加和删除 el-table 行的需要,就学习了下,发现很简单:

<template>
  <el-dialog
    width="50%"
    :visible.sync="isShow"
    :before-close="beforeClose"
    title="自定义设备类型属性">
    <div class="dialogDiv">
      <el-table 
        :data="tableData.filter(data => handleAdd || data.name.toLowerCase().includes(handleAdd.toLowerCase()))" 
        style="width: 100%" border>
        <el-table-column prop="code" 
          :label="$t('basicData.device.propDlg.code')">
        </el-table-column>
        <el-table-column prop="maxValue" 
          :label="$t('basicData.device.propDlg.maxValue')">
        </el-table-column>
        <el-table-column prop="minValue" 
          :label="$t('basicData.device.propDlg.minValue')">
        </el-table-column>
        <el-table-column prop="name" 
          :label="$t('basicData.device.propDlg.name')">
        </el-table-column>
        <el-table-column prop="valueType" 
          :label="$t('basicData.device.propDlg.valueType')">
        </el-table-column>
        <el-table-column prop="warning" 
          :label="$t('basicData.device.propDlg.warning')">
        </el-table-column>
        <el-table-column align="center" width="160px">
          <template slot="header" slot-scope="scope">
            <el-button v-model="handleAdd" 
              size="mini"
              type="success"
              circle plain
              icon="el-icon-plus"
              @click="handleAdd(scope.$index, scope.row)">      
              {{ $t('common.add') }}      
            </el-button>
          </template>
          <template slot-scope="scope">
            <el-button
              size="mini"
              type="primary"
              circle plain
              icon="el-icon-edit"
              @click="handleEdit(scope.$index, scope.row)">
              {{ $t('common.edit') }}
            </el-button>
            <el-button
              size="mini"
              type="danger"
              circle plain
              icon="el-icon-delete"
              @click="handleDelete(scope.$index, scope.row)">
              {{ $t('common.delete') }}
            </el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <span slot="footer">
      <el-button @click="cancel">{{ $t('common.cancel') }}</el-button>
      <el-button @click="confirm" type="primary">{{ $t('common.confirm') }}</el-button>
    </span>
  </el-dialog>
</template>
<script>
export default {
  data() {
    return {
      tableData: []
    }
  },
  methods: {
    // 添加行
    handleAdd() {
      let row = {
        code: "",
        maxValue: "",
        minValue: "",
        name: "",
        valueType: "",
        warning: ""
      }
      this.tableData.push(row) 
    },
    // 编辑
    handleEdit(index, row) {   
    },
    // 删除行
    handleDelete(index, row) {
      this.tableData.splice(index, 1)
    },
    cancel() {
      this.$emit("cancel")
    },
    confirm() {
      this.$emit("confirm", this.tableData)
    }
  }
};
</script>
<style lang="scss" scoped>
.dialogDiv {
  height: 300px;
  overflow: auto;
}
</style>

以上 handleAdd 和 handleDelete 方法便可实现动态添加行和删除行。

原理:vue是数据驱动 dom 进行渲染,所以改变 el-table 绑定的数组,就可以改变 el-table。

点击“添加”按钮就给数组添加一行数据,从而表格也会新增一行,点击“删除”按钮就删除数组当前的这一行数据,从而表格删除当前行。

el-table 合计行放在首行

效果如图所示

首先在el-table ,添加属性

summary-method=“getSummaries” show-summary
<div class="contentInfoWrap">
            <el-table :data="tableData" class="customTable" :summary-method="getSummaries" show-summary border :header-cell-style="HeadTable" :cell-style="columnStyle"
              :row-class-name="tableRowClassName" style="width: 100%">
              <el-table-column width="150" fixed>
                <template slot="header">
                  <div></div>
                </template>
                <template slot-scope="scope">
                  <div class="filstColumn">
                    <span>{{ scope.row.name }}</span>
                  </div>
                </template>
              </el-table-column>
              <el-table-column align="center" width="120" prop="name" label="活动月"></el-table-column>
              <el-table-column align="center" width="120" prop="channel" label="渠道"></el-table-column>
              <el-table-column align="center" width="120" prop="number" label="CPT VOL(箱)"></el-table-column>
            </el-table>
          </div>

2.定义合计行的位置和样式

方法一:通过css 控制

// 合计行样式
.el-table__footer-wrapper tbody td,
.el-table__header-wrapper tbody td {
  background-color: #e3f3ff !important;
  color: #666;
}
.el-table__footer-wrapper .is-leaf {
  color: #666 !important;
}
.el-table__fixed-footer-wrapper tbody td {
  border-top: 1px solid #ebeef5;
  background-color: #e3f3ff;
  color: #666;
  text-align: center !important;
}
.has-gutter tr td .cell {
  text-align: center;
  color: #001111;
}
//合并行放在第一行
.contentInfoWrap .el-table {
  display: flex;
  flex-direction: column;
}
.contentInfoWrap .el-table__body-wrapper {
  order: 1;
}
.contentInfoWrap .el-table__fixed-body-wrapper {
  top: 97px !important;
}
.contentInfoWrap .el-table__fixed-footer-wrapper {
  z-index: 0;
  top: 50px;
}

方法二:通过DOM操作将合计行放置到首行

在mounted中调用该方法即可

showSummariesPosition() {
      const table = document.querySelector('.customTable') // customTable这个是在el-table定义的类名
      const footer = document.querySelector(
        '.customTable .el-table__footer-wrapper'
      )
      const body = document.querySelector(
        '.customTable .el-table__body-wrapper'
      )
      table.removeChild(footer) // 移除表格最下方的合计行
      table.insertBefore(footer, body) // 把合计行插入到表格body的上面
    },

3. 合计行的数据

getSummaries(param) {
      const { columns, data } = param
      const sums = []
      columns.forEach((column, index) => {
        if (index === 0) {
          sums[index] = 'Total(销量)'
          return
        }
        const values = data.map((item) => Number(item[column.property]))
        if (!values.every((value) => isNaN(value))) {
          sums[index] = values.reduce((prev, curr) => {
            const value = Number(curr)
            if (!isNaN(value)) {
              return prev + curr
            } else {
              return prev
            }
          }, 0)
          sums[index] += ' '
        } else {
          sums[index] = ' '
        }
      })
      return sums
    },

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • vue+elementui实现动态添加行/可编辑的table

    本文实例为大家分享了vue+elementui实现动态添加行.可编辑的table的具体代码,供大家参考,具体内容如下 HTMl代码块: <el-col :span="24">     <el-form-item label="与承租户同户籍成员:" :label-width="formLabelWidth">         <el-table :data="zichandetail.members&quo

  • Vue如何动态修改el-table的某列数据

    目录 动态修改el-table的某列数据 设置el-table某一列点击出现输入框可以编辑 动态修改el-table的某列数据 1.对话框打开时调用函数open@opened="checked" 2.可编辑 <el-table-column     -------- visEdit="true"       > 3.同步选中的数据List:multipleSelection ,函数  checked: function () 设置el-table某一列点

  • vuejs element table 表格添加行,修改,单独删除行,批量删除行操作

    1.表格动态添加,也可删除 <template> <div class="TestWord"> <el-button @click="addLine">添加行数</el-button> <el-button @click="save">保存</el-button> <el-table :data="tableData" style="wid

  • Vue+Element实现表格编辑、删除、以及新增行的最优方法

    之前已经实现了表格的新增.编辑和删除,在我的上篇文章中写的也比较详细.但是总感觉有点不完美,首先新增了一行以后,必须要双击某一个单元格参能进行内容的输入.从代码上来说,代码量也较大:而且使用的是原生的html标签,有点尴尬. 于是,进一步研以后,进行了一定的优化,直接使用vue的代码实现,不仅大大减少了代码量,还实现了操作的友好性.下面直接上代码: 1 html部分 这次的优化其实主要在于html部分,直接将vue的el-input标签或者el-select标签放入表格的每个单元格中.这样就不用

  • vue el-table 动态添加行与删除行的实现

    目录 el-table 动态添加行与删除行 el-table 合计行放在首行 首先在el-table ,添加属性 2.定义合计行的位置和样式 3. 合计行的数据 el-table 动态添加行与删除行 项目中有需要动态添加和删除 el-table 行的需要,就学习了下,发现很简单: <template>   <el-dialog     width="50%"     :visible.sync="isShow"     :before-close=

  • 使用jquery为table动态添加行的实现代码

    这里,用的jquery来做的.关键代码如下: 复制代码 代码如下: //添加數據行: function AddRow(){ var vTb=$("#TbData");//得到表格ID=TbData的jquery对象 //所有的数据行有一个.CaseRow的Class,得到数据行的大小 var vNum=$("#TbData tr").filter(".CaseRow").size()+1;//表格有多少个数据行 var vTr=$("#

  • jQuery给指定的table动态添加删除行的操作方法

    最近写程序,碰巧有动态增加删除行的,下面就记录一下. $("#mytable tr").find("td:nth-child(1)") 1表示获取每行的第一列 $("#mytable tr").find("td:nth-child(3)") 3表示获取每行的第三列 今天在项目中,刚好用到给指定的table添加一行.删除一行,就直接找google,搜出来的东西不尽如人意,不是功能不好就是千篇一律,简直浪费时间还不讨好,于是乎就自

  • vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信

    父组件 定义表头和表内容 data(){ return{ // 表格数据 tableColumns: [], // 表头数据 titleData:[], } } 引入并注册子组件 import TableComponents from "../../components/table/table"; //注册子组件table components: { tableC: TableComponents }, 获取表头和表内容数据.(真实数据应该是从接口获取的,由于是测试数据这里我先写死)

  • 对Vue table 动态表格td可编辑的方法详解

    项目中需求用到可编辑表格 下图这种 ↓ element UI 组件table表格中 增加template 模版 翻入input 根据业务逻辑增加全局变量 isEdit 是否变化. <el-table-column label="名称" width="140"> <template scope="scope"> <el-input v-if="scope.row.isEdit && scope

  • vue+element table表格实现动态列筛选的示例代码

    需求:在用列表展示数据时,出现了很多项信息需要展示导致表格横向特别长,展示就不够明晰,用户使用起来可能会觉得抓不住自己的重点. 设想实现:用户手动选择表格的列隐藏还是展示,并且记录用户选择的状态,在下次进入该时仍保留选择的状态. 效果图如下: 原: 不需要的关掉默认的勾选: 实现代码: HTML部分就是用一个多选框组件展示列选项 用v-if="colData[i].istrue"控制显示隐藏,把列选项传到checkbox里再绑定勾选事件. <el-popover placemen

  • vue element table中自定义一些input的验证操作

    官网原话 Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item 的 prop 属性设置为需校验的字段名即可. 表单 el-form表单必备以下三个属性: :model="ruleForm" 绑定的数据内容 :rules="rules" 动态绑定的rules,表单验证规则 ref="ruleForm" 绑定的对象 template模块 其实问题关键就在于如何给el-form-item动态绑定p

  • Vue.js Ajax动态参数与列表显示实现方法

    Vue.js简介 vue是法语中视图的意思,Vue.js是一个轻巧.高性能.可组件化的MVVM库,同时拥有非常容易上手的API. 一.动态参数显示 ajax异步请求后,接收到返回的data参数并显示在前端 1.1 引入js,也加入了jQuery <script type="text/javascript" src="/js/vue.min.js"></script> <script type="text/javascript&

随机推荐