vue基于element实现动态表格

Posted 水星记_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue基于element实现动态表格相关的知识,希望对你有一定的参考价值。

前言

大家都知道element表格组件的表头是静态写死的,我们在渲染数据时只需要将接口返回的数组动态绑定给 data 属性,然后再通过 prop 去对应字段项即可;但是静态的表头并不能满足一些特殊的使用场景,所以我们需要将它变成活的,也就是动态渲染表头,然后再将表格中的数据一一对应表头。

实现效果:

实现思路:

与静态表格返回的数据格式不同(如下图),动态表格一般会返回两个数组,分别对应表头数据、表格数据,我们需要将表头的数组在 <el-table-column></el-table-column> 中进行循环,用 :label 绑定循环的表头字段名,用 :prop 绑定表格中的字段名。

表头数据格式:

表格数据格式:

表格中用到的属性:

属性描述类型默认值
highlight-current-row是否要高亮当前行booleanfalse
cell-style改变单元格样式Function(row, column, rowIndex, columnIndex)/Object-----

下面是我做的一个简单小实例,其中不止包含动态表格,还有其他方面的一些小功能(根据条件让单元格变色、根据条件控制单元格是否可编辑)

源码如下:

<template>
  <div>
    <el-dialog title="编辑" :visible.sync="centerDialogVisible" width="80%">
      <el-table class="tableBox" :data="tableData" align="center" border style="width: 100%;" :cell-style="myclass" highlight-current-row>
        <el-table-column align="center" v-for="(item, index) in headData" :key="index" :prop="item.value" :label="item.zwname">
          <template slot-scope="scope">
            <!--// 通过 v-if="!item.sfkgg" 控制是否可编辑单元格 //-->
            <el-input v-if="!item.sfkgg" v-model="scope.row[index] && scope.row[index].value" clearable />
            <span>scope.row[index] && scope.row[index].value</span>
          </template>
        </el-table-column>
      </el-table>
      <div>
        <el-button type="primary" @click="present ">提交</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
export default 
  data() 
    return 
      centerDialogVisible: true, //弹框显隐状态
      // 模拟表头数据
      headData: [
        
          zwname: "id", //表头
          sfkgg: true, //判断单元格是否可编辑
          sfcb: null, //判断字体是否变色
        ,
        
          zwname: "姓名",
          sfkgg: true,
          sfcb: null,
        ,
        
          zwname: "性别",
          sfkgg: false,
          sfcb: true,
        ,
        
          zwname: "年龄",
          sfkgg: false,
          sfcb: true,
        ,
        
          zwname: "地址",
          sfkgg: false,
          sfcb: true,
        ,
        
          zwname: "联系方式",
          sfkgg: false,
          sfcb: true,
        ,
      ],
      // 模拟表格数据
      tableData: [
        [
          
            zwname: "样品编号",
            zdm: "ypbh",
            value: "id20200719",
            sfkgg: true,
            sfcb: null,
          ,
          
            zwname: "样品名称",
            zdm: "ypmc",
            value: "小明",
            sfkgg: true,
            sfcb: null,
          ,
          
            zwname: "分配省公司",
            zdm: "fpsgs",
            value: "男",
            sfkgg: true,
            sfcb: null,
          ,
          
            zwname: "受检单位",
            zdm: "sjdw",
            value: "20",
            sfkgg: true,
            sfcb: null,
          ,
          
            zwname: "油号",
            zdm: "yhbh",
            value: "北京昌平",
            sfkgg: true,
            sfcb: null,
          ,
          
            zwname: "抽样地点",
            zdm: "cydd",
            value: "18812349874",
            sfkgg: true,
            sfcb: false,
          ,
        ],
        [
          
            zwname: "样品编号",
            zdm: "ypbh",
            value: "id20220102",
            sfkgg: true,
            sfcb: null,
          ,
          
            zwname: "样品名称",
            zdm: "ypmc",
            value: "小红",
            sfkgg: true,
            sfcb: null,
          ,
          
            zwname: "分配省公司",
            zdm: "fpsgs",
            value: "女",
            sfkgg: true,
            sfcb: false,
          ,
          
            zwname: "受检单位",
            zdm: "sjdw",
            value: "18",
            sfkgg: true,
            sfcb: null,
          ,
          
            zwname: "油号",
            zdm: "yhbh",
            value: "北京海淀",
            sfkgg: true,
            sfcb: null,
          ,
          
            zwname: "抽样地点",
            zdm: "cydd",
            value: "18856432547",
            sfkgg: true,
            sfcb: null,
          ,
        ],
        [
          
            zwname: "样品编号",
            zdm: "ypbh",
            value: "id20220717",
            sfkgg: true,
            sfcb: null,
          ,
          
            zwname: "样品名称",
            zdm: "ypmc",
            value: "小蓝",
            sfkgg: true,
            sfcb: null,
          ,
          
            zwname: "分配省公司",
            zdm: "fpsgs",
            value: "未知",
            sfkgg: true,
            sfcb: null,
          ,
          
            zwname: "受检单位",
            zdm: "sjdw",
            value: "21",
            sfkgg: true,
            sfcb: false,
          ,
          
            zwname: "油号",
            zdm: "yhbh",
            value: "北京朝阳",
            sfkgg: true,
            sfcb: null,
          ,
          
            zwname: "抽样地点",
            zdm: "cydd",
            value: "16634219856",
            sfkgg: true,
            sfcb: null,
          ,
        ],
      ],
    ;
  ,
  mounted() ,
  methods: 
    //根据条件修改单元格字体样式(sfcb字段为false且不为null时)
    myclass( row, columnIndex ) 
      if (row[columnIndex] && !row[columnIndex].sfcb && row[columnIndex].sfcb != null ) 
        return "color: red";
      
    ,
    // 提交操作
    present() 
      let result = [];
      // 通过双层循环拿到所需字段
      this.tableData.forEach((item) => 
        let data = ;
        item.forEach((e) => 
          // 将字段名、字段值以键值对的形式赋值
          data[e.zdm] = e.value;
        );
        // 每一行数据为一个对象添加到数组中 [,,,...]
        result.push(data);
      );
      console.log(result, "参数");
      // 执行接口操作
    ,
  ,
;
</script>

<style scoped>
.tableBox 
  margin-bottom: 20px;

/* 通过显隐控制input框的状态 */
.tableBox .el-input 
  display: none;

.tableBox .current-row .el-input 
  display: block;

.tableBox .current-row .el-input + span 
  display: none;

</style>

至此,这个功能就实现啦。

以上是关于vue基于element实现动态表格的主要内容,如果未能解决你的问题,请参考以下文章

vue基于el-timeline组件实现动态表格时间线

vue基于el-timeline组件实现动态表格时间线

vue element ui 实现动态表格/表单(新增/删除行)

封装element中的table表格,实现可控并动态渲染(动态表头)

element-UI table动态增加列,动态增加行,动态合并行。选择编辑表头行数据

基于vue+Element Table 表格的封装