vue+element实现动态表格:根据后台返回的属性名和字段动态生成可变表格

news2024/11/16 20:41:13

现有一个胡萝卜厂生产不同品种的胡萝卜,为了便于客户了解产品,现需在官网展示胡萝卜信息。现有的萝卜信息:编号(id)、名称(name)、保质期(age)、特点(remark),但是日后会有扩展信息,可能会加上颜色、体积等信息。
1、template

问题分析:
现在可以确定胡萝卜有4个属性要展示,以后还要扩展信息,而且这个厂以后可能生产别的蔬菜水果,也需要展示相应信息,需求变动的话要修改很多代码。这时候如果有一个动态表格,表格的表头信息从后台获取(或在js中配置),那日后修改胡萝卜表的属性(增加或删除表字段)时就不用修改前端页面代码,长远一点来看,日后这个厂生产别的蔬菜水果也需要信息展示时,这个表格就可以复用(把表格抽出来当一个模板,需要用的页面引用即可,这个代码我有时间会从项目中整理出来)。

代码上场啦!!!
动态表格

<el-row>
        <el-row> 
          <el-col><span>可选择属性:</span></el-col>
          <el-col>
            <el-checkbox-group v-model="checkArr" size="medium">
                <el-col :span=12 v-for="item in optionalColumnList" :key="item.prop">
                    <el-row :gutter=20>
                      <el-col>
                        <el-col :span=2><el-checkbox :label="item.propName" @change="menuChange(item)" ></el-checkbox></el-col>
                      </el-col>   
                   </el-row>
                </el-col>
            </el-checkbox-group>
          </el-col>
        </el-row>
    </el-row>
 <el-table class="fixedtableHeight" v-loading="listLoading" ref="multipleTable" :data="showList" :header-cell-style="{background:'#96CDCD'}" stripe tooltip-effect="dark" style="width: 100%;margin-top:1%;">
        <el-table-column :label="item.propName" :property="item.prop" v-for="item in tableColumnList" :key="item.prop" align="center">
              <template slot-scope="scope">
                    <span>{
   {scope.row[scope.column.property]}}</span>
              </template>
          </el-table-column>
  </el-table>

注意tableColumnList就是实现动态的关键因素!
tableColumnList里面存放的就是我们通过js文件或者接口获取到的表头属性,内容如下:

[{prop: ‘id’, propName: ‘编号’},
{prop: ‘name’, propName: ‘名称’},
{prop: ‘age’, propName: ‘保质期’},
{prop: ‘remark’, propName: ‘特点’}],

rop跟胡萝卜表中的字段是一一对应的,propName就是每个字段的中文名,也即在表头显示的名字。

tableColumnList的获取方法有两种:

(1)在前端js中配置

我是放在static文件夹下面的config.js中,目录如下:
在这里插入图片描述
内容:直接声明一个数组变量并赋值就好,用的时候引入js直接使用名字就可以使用
放在这里的好处:前端项目打包成dist时,会把这个static文件夹放在dist里面,以后修改的时候就直接修改js配置文件,不用动.vue源代码。

(2)从后端接口获取

注意,采用此种方法获取。后端接口一定要同时返回属性的中文名和英文名,即prop和propName。

还有一个关键步骤,就是一定要在在页面渲染之前获取到tableColumnList,然后再去渲染表格,这就涉及到vue的生命周期了,这块不做多余解释,我是直接在created中调用获取tableColumnList的方法,整个js如下:

<script>
export default {
  data() {
    return {
      listLoading: false,
      showList: [],
      // 这里为了简便我就没有调用后台接口获取数据,直接写的假数据  你要用的话可以调用后台接口获取tableColumnList,注意数据格式
      tableColumnList: [{prop: 'id', propName: '编号'},
                        {prop: 'name', propName: '名字'},
                        {prop: 'age', propName: '保质期'},
                        {prop: 'remark', propName: '特点'}],
      // 这里为了简便我就没有调用后台接口获取数据,直接写的假数据
      dataList: [{'id': '100001','name': '小红萝卜','age': '2年','remark': '适合油炸','country': '中国','address': '广东省深圳市'},
                 {'id': '100002','name': '萝卜妹','age': '2年','remark': '适合水煮','country': '美国','address': '硅谷'},
                 {'id': '100003','name': '胖萝卜头','age': '1年','remark': '适合玩儿','country': '泰国','address': '清迈'},
                 {'id': '100004','name': '萝卜酱','age': '4年','remark': '适合吃火锅','country': '韩国','address': '首尔'}],
      optionalColumnList: [{prop: 'country', propName: '出口国家'},
                           {prop: 'address', propName: '零售点'}],
      checkArr:[]
    }
  },
  created() {
    this.queryFn()
  },
  methods: {
    queryFn() {
      // 调用后台接口获取tableColumnList和dataList的方法写在这里
        // getData().then(response =>{
        //   this.tableColumnList = response.data.tableColumnList
        //   this.dataList = response.data.dataList
        // })
        this.showList = this.dataList
    },
    clearQuery() {
      this.query.name = ''
      this.queryFn()
    },
    menuChange(item){
      // 注意  我这里都用的假数据,要从后台获取tableColumnList和dataList的时候
      //,每一次调用menuChange都要重新获取tableColumnList和dataList,保证属性和数据是对应的   
      let flag = true
      for(var i=0;i<this.checkArr.length;i++){
        if(this.checkArr[i] === item.propName){
          flag = false
          break
        }
      }
      if(!flag){
        this.tableColumnList.push(item)
      }
      if(flag){
        Array.prototype.contains = function(obj) {
          var j = this.length;
          while (j--) {
            if (this[j] === obj) {
            return j; // 返回的这个 i 就是元素的索引下标,
            }
          }
          return false
        }
        this.tableColumnList.splice(this.tableColumnList.contains(item),1)
      }
    },
  }
}
</script>

解释一下menuChange方法:
当用户勾选一个可选择属性之后,就触发这个方法,这个方法主要做一件事情:

改变tableColumnList的值,从而动态改变表格的列

页面效果如下:
在这里插入图片描述

可选择属性有两个(也可以看作以后可能扩展的属性,这里只演示一下动态效果),勾选之后:
在这里插入图片描述在这里插入图片描述
注意

动态表格与element一般表格在使用方法上的两个区别:

1、label与property的赋值方式
动态表格,表格的label和property是动态根据后台返回的数据(或者从js获取)来取值的,后台返回的数据就是上面的tableColumnList。

通过 :label=“item.propName” 取得tableColumnList中的propName,也就是表头每一列的名字;
通过 :property=“item.prop” 取得tableColumnList中对象的prop,也就是后台实体类中的属性名,
2、属性和数据双向绑定方式,也就是 scope.row.*

通过 ** scope.row[scope.column.property]** 来获取每一个属性对应的数据, scope.column.property 中的property取的就是 :property=“item.prop” 中的值;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1339107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python编程:计算当前日期是一年中的第几天

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;计算当前日期是一年中的第几天可以通过内置的datetime模块来实现。这个任务涉及到日期处理和一些基本的数学计算。在本文中&#xff0c;将详细介绍如何使用Python编写代码来完成这个任务&…

视频压缩不影响画质简单方法,一分钟搞定!

很多朋友在处理视频的时候都会遇到视频过大的问题&#xff0c;想要压缩视频的同时不影响画质&#xff0c;简单的方法有两种。一种是用专业的压缩软件&#xff0c;在压缩的时候设置一个合适的压缩比例&#xff0c;压缩大小的同时保持清晰度&#xff0c;也能提高压缩率&#xff0…

机器人创新实验室任务三参考文档

一、JAVA环境配置 需要在Linux里面下载并且安装java。 sudo apt-get install openjdk-17-jre-headless 打开终端并且运行指令&#xff0c;用apt下载安装java。官方用的好像是java11&#xff0c;我安装的是java17。 如果无法定位软件安装包&#xff0c;可以试试更新一下 sudo …

ubuntu 在线安装 python3 pip

ubuntu 在线安装 python3 pip 安装 python3 pip sudo apt -y install python3 python3-pip升级 pip python3 -m pip install --upgrade pip

【零成本实现接口自动化测试】Java+TestNG 测试Restful service

接口自动化测试 – JavaTestNG 测试 Restful Web Service 关键词&#xff1a;基于Rest的Web服务&#xff0c;接口自动化测试&#xff0c;数据驱动测试&#xff0c;测试Restful Web Service&#xff0c; 数据分离&#xff0c;JavaMavenTestNG 本文主要介绍如何用Java针对Restf…

成都爱尔樊映川院长解析视网膜脱离之紧急72小时

熬夜工作、熬夜游戏…… 眼睛模糊到看不清? 突然眼前发生大量漂浮物? 眼前有块遮挡黑影? 眼前有闪光感? 这些情况虽然并非确诊视网膜发生脱离&#xff0c;但需要赶紧到院就诊&#xff0c;做到及时发现及时治疗。 视网膜脱离 视网膜脱离(简称“网脱”)是视网膜神经上皮层与色…

【并发设计模式】聊聊 基于Copy-on-Write模式下的CopyOnWriteArrayList

在并发编程领域&#xff0c;其实除了使用上一篇中的属性不可变。还有一种方式那就是针对读多写少的场景下。我们可以读不加锁&#xff0c;只针对于写操作进行加锁。本质上就是读写复制。读的直接读取&#xff0c;写的使用写一份数据的拷贝数据&#xff0c;然后进行写入。在将新…

基于Java (spring-boot)的超市管理系统

一、项目介绍 超市管理系统对商品日常维护、售卖、商品类别、存储记录、库存维护等功能的统计及整理。系统设计了系统管理员&#xff0c;销售人员&#xff0c;仓库管理员多个角色。通过多角色、多功能的使用&#xff0c;可以方便地查询商品的库存值、是否临期、是否库存紧张&am…

ubuntu20 安装缺失的字体

在/usr/share/fonts创建文件夹winfonts sudo mkdir winfonts 下载缺失的字体后&#xff0c;复制命令到对应的文件夹。 刷新字体库 sudo mkfontscale sudo mkfontdir sudo fc-cache

可视化远程监控EasyCVR及AI识别技术在种植养殖基地/果园场景中的应用建设

一、背景与需求 种植园、果园一般场地面积较大&#xff0c;看守人员较少&#xff0c;财产安全成为了关注的重点。传统靠人力监管的方式效率低下&#xff0c;管理也较为片面且人力投入大&#xff0c;那么如何实现少人化、智能化监管&#xff0c;助力果园安全监控、守护园区安全…

怎么用Facebook找客户?Facebook开发客户攻略分享

跨境人最了解的电商平台之一就是Facebook了&#xff0c;说到Facebook&#xff0c;它拥有超过20亿的活跃用户&#xff0c;所以你可以在这个平台上面找到更多的潜在客户。今天的文章就主要分享用Facebook开发客户的方法&#xff0c;全是干货&#xff0c;建议收藏&#xff01; 一、…

IPv4 VS IPv6代理全解,跨境电商代理IP选哪种?

IP&#xff08;互联网协议&#xff09;被网站用来收集用户位置信息。当今最流行的两种互联网协议是 IPv4 和 IPv6。 在我们选择IP代理的过程中可以看到IPv4、IPv6两种类型&#xff0c;他们有何区别&#xff1f;如何选择&#xff1f;下面为大家讲解&#xff01; 在这篇文章中&a…

全面理解Stable Diffusion采样器

全面理解Stable Diffusion采样器 原文&#xff1a;Stable Diffusion Samplers: A Comprehensive Guide 在 AUTOMATIC1111 的 SD webui 中&#xff0c;有许多采样器&#xff08;sampler&#xff09;&#xff0c;如 Euler a&#xff0c;Heun&#xff0c;DDIM&#xff0c;… 什么是…

.NET CORE 无法调试 当前不会命中断点

多个项目直接可以设置项目的属性->生成->输出的配置文件输出地址 然后路径统一输入该项目的bib/debug/.netcorex.x就可以了

Pandas教程(二)—— 不同格式的数据读取

前言&#xff1a;几种常用数据格式的介绍 csv文件 1. 逗号分隔值文件&#xff0c;以纯文本形式&#xff08;记事本&#xff09;存储表格数据 2. 它是一种平面文件&#xff1a;即只存储数据和文字&#xff0c;不能存储公式、图表等 3. 更适合存储大数据&#xff0c;一般用来批…

如何解决msvcr100.dll丢失问题,深度解析5种靠谱的方法

在计算机的世界里&#xff0c;我们常常会遇到一些看似微不足道的问题&#xff0c;但它们却可能引发一系列的困扰。其中之一就是“msvcr100.dll丢失”。这个问题可能会导致某些程序无法正常运行。本文将介绍5种解决msvcr100.dll丢失问题的方法。 msvcr100.dll是什么 msvcr100.d…

NXP S32K358 davinci cfg can驱动配置

NXP S32K358一共有8路can&#xff0c;都支持Can FD和Classical Can。其中FlexCan0-2是增强型CAN&#xff0c;支持8byte的mailbox 96个。FlexCan3-7支持8byte的mailbox 64个。 1.增强型Can和普通Can波特率采样点设置区别 在NXP S32K358中增强CAN的波特率采样点的寄存器和普通C…

新手为什么跟着大型机构交易?fpmarkets总结理由

正所谓方向不对努力白费&#xff0c;这也就是为什么fpmarkets建议新手在刚开始的时候&#xff0c;跟着大型机构进行交易。 这些大型机构包括中央银行、巨额对冲基金、投资和保险公司等等&#xff0c;首先fpmarkets认为这些大型机构的交易量巨大&#xff0c;能够影响市场的走势。…

2023年12月27日学习记录_加入噪声

目录 1、今日计划学习内容2、今日学习内容1、add noise to audio clipssignal to noise ratio(SNR)加入 additive white gaussian noise(AWGN)加入 real world noises 2、使用kaggel上的一个小demo&#xff1a;CNN模型运行时出现的问题调整采样率时出现bug 3、明确90dB下能否声…

hadoop hive spark flink 安装

下载地址 Index of /dist ubuntu安装hadoop集群 准备 IP地址主机名称192.168.1.21node1192.168.1.22node2192.168.1.23node3 上传 hadoop-3.3.5.tar.gz、jdk-8u391-linux-x64.tar.gz JDK环境 node1、node2、node3三个节点 解压 tar -zxvf jdk-8u391-linux-x64.tar.gz…