前后端交互之动态列

一. 情景

  • 在做项目时,有时候后会遇到后端使用了聚合函数,导致生成的对象的属性数量或数量不固定,因此无法建立一个与之对应的对象来向前端传递数据,
  • 这时可以采用NameDataListVO向前端传递数据。
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class NameDataListVO {
    private String name;                 //名称(可以是聚合函数的分组名)
    private List<BigDecimal> data1;      //数据
    private List<BigDecimal> data2;
    private List<String> desp;            //与数据List的长度相等,用于描述每个数据的含义 
}

二. 前端处理

1. 数据显示

要想显示如下的数据
在这里插入图片描述

(1) 前端接收的List< NameDataVOList>对象(其中每个对象的desp字段保持一致

this.rawData=[
    {
      "name": "2023",
      "data1": [85.5, 92.3, 88.1, 91.4, 87.6, 89.8, 93.2, 90.0, 86.7, 88.9, 92.5, 91.1],
      "data2": null,
      "desp": ["张三", "李四", "王五", "赵六", "钱七", "周八", "吴九", "郑十", "王十一", "李十二", "赵十三", "孙十四"]
    },
    {
      "name": "2022",
      "data1": [82.4, 90.5, 85.3, 89.7, 84.2, 86.9, 88.4, 83.6, 87.8, 91.2, 90.1, 84.5],
      "data2": null,
      "desp": ["张三", "李四", "王五", "赵六", "钱七", "周八", "吴九", "郑十", "王十一", "李十二", "赵十三", "孙十四"]
    },
  ]

要想在前端正确显示,必须将data由数组转为prop:value(注意:为了使得this.columnList中的列名(label)与属性(prop)一一对应,可以以data_${index}来命名属性)

this.columnList=["张三", "李四", "王五", "赵六", "钱七", "周八", "吴九", "郑十", "王十一", "李十二", "赵十三", "孙十四"]
this.processedData=[
    {
      "name": "2023",
      "data_0":85.5,
      "data_1":92.3
      "data_2":88.1
      "data_3":91.4

    },
    {
      "name": "2022",
      "data_0":85.5,
      "data_1":92.3
      "data_2":88.1
      "data_3":91.4
    },
  ]
  • 前端数据处理代码:
    if (this.rawData.length > 0) {
       this.columnList = this.rawData[0].dep;
       this.processedData=processData(this.rawData)
   }
   processData(rawData) {
      return rawData.map(item => {
        const processedItem = {
          name: item.name,
        };
        item.data1.forEach((data, index) => {
          processedItem[`data_${index}`] = data;
        });
        return processedItem;
      });
    },

(2) 前端页面显示

<el-table :data="processedData" height="800" v-loading="loading" @selection-change="handleSelectionChange">
    <el-table-column type="selection" width="55" />
          <el-table-column prop="name" label="聚类名称" sortable width="60" align="center" />
          <el-table-column v-for="(column, index) in columnList" :key="index" :label="column" :prop="`data_${index}`"
            align="center" v-if="columns[index].visible">
            <template slot-scope="scope">
              <span>{{ scope.row[`data_${index}`] }}</span>
            </template>
   </el-table-column>
</el-table>
2. 显隐列

新建列配置列表this.columns,通过使用 v-if=“columns[index].visible” 来控制是该列是否显示

//构建columns配置列表
    buildColumns(rawData) {
      // 初始化一个空数组用于存储列配置
      this.columns = [];

      // 将列名称添加到列配置中,动态生成key
      this.columnList.forEach((c, index) => {
        let key = this.columns.length; // 使用 this.columns 数组的当前长度作为 key
        this.columns.push({
          key: key,
          label: c,
          visible: true
        });
      });
    },
3. Echarts图表显示
  • chartOptions 是一个计算属性,它返回一个对象,这个对象包含了图表的配置项。每当组件的数据发生变化时,chartOptions 会重新计算,并且图表会根据新的配置进行更新。
<template>
 <div class="app-container">
   <!-- ... 其他代码 ... -->

   <!-- 生成图表按钮 -->
   <el-button type="warning" plain icon="el-icon-s-data" size="mini" @click="handleGraph">生成图表</el-button>

   <!-- ... 其他代码 ... -->

   <!-- 图表对话框 -->
   <el-dialog title="图表展示" :visible.sync="chartDialogVisible" width="80%">
     <div ref="chart" style="width: 100%; height: 500px;"></div>
   </el-dialog>

   <!-- ... 其他代码 ... -->
 </div>
</template>

<script>
// 引入echarts
import * as echarts from 'echarts';

export default {
 // ... 其他选项 ...

 data() {
   return {
     // ... 其他数据 ...
     chartDialogVisible: false, // 控制图表对话框的显示
     // 假设yearList是存储年份的数组
     yearList: [],
   };
 },
 computed: {
   // ... 其他计算属性 ...

   chartOptions() {
     const xAxisData = this.columnList;
     const seriesData = this.processedData.map(item => ({
       name: item.name,
       type: 'bar',
       data: Object.keys(item)
         .filter(key => key.startsWith('data_')) // 过滤出以 'data_' 开头的键
         .map(key => item[key]) // 获取每个 'data_X' 属性的值
     }));

     return {
       legend: {
         data: this.nameList
       },
       tooltip: {},
       xAxis: {
         type: 'category',
         data: xAxisData,

       },
       yAxis: {
         // // 设置 y 轴的最大值为数据中的最大值加上 20%
         // max: (value) => {
         //   return value.max + value.max * 0.2;
         // }
       },
       dataZoom: [
         {
           type: 'slider',
           show: true,
           xAxisIndex: [0],
           start: 1,
           end: 35
         },
         {
           type: 'inside',
           xAxisIndex: [0],
           start: 1,
           end: 35
         }
       ],
       toolbox: {
         show: true,
         feature: {
           mark: { show: true },
           saveAsImage: { show: true },
         }
       },
       series: seriesData
     };
   }
 },
 methods: {
   // ... 其他方法 ...

   // 处理图表显示
   handleGraph() {
     this.chartDialogVisible = true;
     this.$nextTick(() => {
       this.initChart();
     });
   },

   // 初始化图表
   initChart() {
     const chart = echarts.init(this.$refs.chart);
     const options = this.chartOptions;
     chart.setOption(options);
   },

   // ... 其他方法 ...
 }
};
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s服务内容滚动升级以及常用命令介绍

查看K8S集群所有的节点信息 kubectl get nodes 删除K8S集群中某个特定节点 kubectl delete nodes/10.0.0.123 获取K8S集群命名空间 kubectl get namespace 获取K8S所有命名空间的那些部署 kubectl get deployment --all-namespaces 创建命名空间 web界面上看到的效果,但是…

【视觉SLAM】1-概述

读书笔记 文章目录 1. 经典视觉SLAM框架2. 数学表述2.1 运动方程2.2 观测方程2.3 问题抽象 1. 经典视觉SLAM框架 传感器信息读取&#xff1a;相机图像、IMU等多源数据&#xff1b;前端视觉里程计&#xff08;Visual Odometry&#xff0c;VO&#xff09;&#xff1a;估计相机的相…

低成本出租屋5G CPE解决方案:ZX7981PG/ZX7981PM WIFI6千兆高速网络

刚搬进新租的房子&#xff0c;没有网络&#xff0c;开个热点&#xff1f;续航不太行。随身WIFI&#xff1f;大多是百兆级网络。找人拉宽带&#xff1f;太麻烦&#xff0c;退租的时候也不能带着走。5G CPE倒是个不错的选择&#xff0c;插入SIM卡就能直接连接5G网络&#xff0c;千…

如何在Typora中绘制流程图

如何在Typora中绘制流程图 在撰写文档时&#xff0c;清晰的流程图能极大地提升信息传递的效率。Typora是一款优秀的Markdown编辑器&#xff0c;支持通过Mermaid语法快速绘制流程图。本文将介绍如何在Typora中创建和自定义流程图&#xff0c;帮助你用更直观的方式呈现逻辑结构和…

莱特币转型MEME币:背后隐含的加密市场现象

随着加密市场的风云变幻&#xff0c;莱特币&#xff08;LTC&#xff09;这款曾经的“老牌矿币”近日以自嘲式推文宣布“自己是一个MEME币”&#xff0c;迅速引发了市场的广泛关注和一波围绕MEME币的炒作浪潮。这一举动看似玩笑&#xff0c;却反映出当前加密市场的一种微妙转变&…

【代码大模型】Is Your Code Generated by ChatGPT Really Correct?论文阅读

Is Your Code Generated by ChatGPT Really Correct? Rigorous Evaluation of Large Language Models for Code Generation key word: evaluation framework, LLM-synthesized code, benchmark 论文&#xff1a;https://arxiv.org/pdf/2305.01210.pdf 代码&#xff1a;https:…

LC12:双指针

文章目录 125. 验证回文串 本专栏记录以后刷题碰到的有关双指针的题目。 125. 验证回文串 题目链接&#xff1a;125. 验证回文串 这是一个简单题目&#xff0c;但条件判断自己写的时候写的过于繁杂。后面参考别人写的代码&#xff0c;首先先将字符串s利用s.toLowerCase()将其…

MySQL5.7.37安装配置

1.下载MySQL软件包并解压 2.配置环境变量 3.新建my.ini文件并输入信息 [mysqld] #端口号 port 3306 #mysql-5.7.27-winx64的路径 basedirC:\mysql-5.7.37\mysql-5.7.37-winx64 #mysql-5.7.27-winx64的路径\data datadirC:\mysql-5.7.37\mysql-5.7.37-winx64\data #最大连接数…

python习题4

1 判断车牌归属地 输入一串车牌号&#xff0c;按e结束&#xff0c;判断车牌归属于那里 例如&#xff1a; 输入&#xff1a; jingA12345 huB34567 zheA99999 e 输出&#xff1a; jing hu zhe chepai input(请输入车牌号&#xff1a;\n) lst [] while chepai ! e:lst…

【原创】java+ssm+mysql社区疫情防控管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

《深度学习》VGG网络

文章目录 1.VGG的网络架构2.案例&#xff1a;手写数字识别 学习目标&#xff1a; 知道VGG网络结构的特点能够利用VGG网络完成图像分类 2014年&#xff0c;⽜津⼤学计算机视觉组&#xff08;Visual Geometry Group&#xff09;和GoogleDeepMind公司的研究员⼀起研发出了新的深度…

探索 Python HTTP 的瑞士军刀:Requests 库

文章目录 探索 Python HTTP 的瑞士军刀&#xff1a;Requests 库第一部分&#xff1a;背景介绍第二部分&#xff1a;Requests 库是什么&#xff1f;第三部分&#xff1a;如何安装 Requests 库&#xff1f;第四部分&#xff1a;Requests 库的基本函数使用方法第五部分&#xff1a…

无桥Boost-PFC 双闭环控制MATLAB仿真

一、无桥Boost-PFC原理概述 无桥 Boost-PFC&#xff08;Power Factor Correction&#xff0c;功率因数校正&#xff09;的工作原理是通过特定的电路结构和控制策略&#xff0c;对输入电流进行校正&#xff0c;使其与输入电压同相位&#xff0c;从而提高电路的功率因数&#xf…

数据结构Python版

2.3.3 双链表 双链表和链表一样&#xff0c;只不过每个节点有两个链接——一个指向后一个节点&#xff0c;一个指向前一个节点。此外&#xff0c;除了第一个节点&#xff0c;双链表还需要记录最后一个节点。 每个结点为DLinkNode类对象&#xff0c;包括存储元素的列表data、…

力扣-Hot100-二叉树其一【算法学习day.32】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

京东商品详情,Python爬虫的“闪电战”

在这个数字化的时代&#xff0c;我们每天都在和数据打交道&#xff0c;尤其是电商数据。想象一下&#xff0c;你是一名侦探&#xff0c;需要快速获取京东上某个商品的详细信息&#xff0c;但是没有超能力&#xff0c;怎么办&#xff1f;别担心&#xff0c;Python爬虫来帮忙&…

深度学习推荐系统的工程实现

参考自《深度学习推荐系统》——王喆&#xff0c;用于学习和记录。 介绍 之前章节主要从理论和算法层面介绍了推荐系统的关键思想。但算法和模型终究只是“好酒”&#xff0c;还需要用合适的“容器”盛载才能呈现出最好的味道&#xff0c;这里的“容器”指的就是实现推荐系统…

「QT」高阶篇 之 d-指针 的用法

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案

在当今快速发展的农业领域&#xff0c;智慧农业已成为推动农业现代化、助力乡村全面振兴的新手段和新动能。随着信息技术的持续进步和城市化进程的加快&#xff0c;智慧农业对于监控安全和智能管理的需求日益增长。 视频设备轨迹回放平台EasyCVR作为智慧农业视频远程监控管理方…

计算机视觉空域处理完整版——超详细图文解

空域处理 图像空域处理 a.线性滤波b.非线性滤波c.二值图像处理方法 数学形态学连通成分标记 “点运算”是在不改变图像大小、几何形状以及局部结构的情况下&#xff0c;对像素值进行修改&#xff0c;新图像的像素值只与 原图像同一位置的像素值有关。 灰度级变换(线性变换,非…