草庐IT

vue基于element实现动态表格

水星记_ 2023-05-10 原文

前言

大家都知道 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基于el-timeline组件实现动态表格时间线)

有关vue基于element实现动态表格的更多相关文章

  1. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  2. ruby-on-rails - Prawn - 表格单元格内的链接 - 2

    我正在尝试用Prawn生成PDF。在我的PDF模板中,我有带单元格的表格。在其中一个单元格中,我有一个电子邮件地址:cell_email=pdf.make_cell(:content=>booking.user_email,:border_width=>0)我想让电子邮件链接到“mailto”链接。我知道我可以这样链接:pdf.formatted_text([{:text=>booking.user_email,:link=>"mailto:#{booking.user_email}"}])但是将这两行组合起来(将格式化文本作为内容)不起作用:cell_email=pdf.make_c

  3. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  4. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  5. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  6. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  7. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  8. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  9. ruby - 如何使用 Ruby 将 CSV 文件读入 HTML 表格? - 2

    我正在尝试将一个简单的CSV文件读入HTML表格以在浏览器中显示,但我遇到了麻烦。这就是我正在尝试的:Controller:defshow@csv=CSV.open("file.csv",:headers=>true)end查看:输出:NameStartDateEndDateQuantityPostalCode基本上我只获取标题,而不会读取和呈现CSV正文。 最佳答案 这最终成为最终解决方案:Controller:defshow#OpenaCSVfile,andthenreaditintoaCSV::Tableobjectforda

  10. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

随机推荐