el-table实现日期表头+二级表头+嵌套echarts

先上效果图
在这里插入图片描述
在这里插入图片描述

表头的时间首个是搜索项的endTime,后面的时间则是startTime到endTime-1的正序排列,折线图则是时间的正序排列
1、先实现月份表头,用的是项目封装后的el-table,但是跟直接在页面上实现没有啥区别

//数据结构
{"status":200,"message":"SUCCESS","data":{"records":
[{
"customerName":"客户A",
"applicationId":"11111111",
"statisticNum":
{"2024-01_stock":0,
"2023-09_incr":1,
"2023-10_stock":3,
"2023-09_stock":1,
"2023-12_stock":2,
"2024-02_incr":0,
"2023-12_incr":2,
"2023-11_incr":1,
"2023-11_stock":1,
"2024-01_incr":0,
"2024-02_stock":0,
"2023-10_incr":3}
},],"total":"xxx","size":"xxx","current":"xxx","searchCount":true,"pages":"xxxx"}}
//存量&增量下拉框值v-model="incrOrstock"
<el-option value="6" label="存量&增量"></el-option>
<el-option value="2" label="存量"></el-option>
<el-option value="3" label="增量"></el-option>
//methods
//在调取列表接口前调用获取头部方法getList(){const params = {aa:xxx,bb:xxx};this.generateCols();//调用表头方法tableApi(params).then((res)=>{//处理完下面的表头数据这的this.tableDefs里就有了cols属性,页面上展示的数据用的也是cols里的this.tableDefs.data = res.data.records; //给el-table赋值//从这是后面设置eacharts时用的if (res.data.records.length) {this.incrArr = [];//增量this.stockArr = [];//存量this.statisticNum = [];//总的数据res.data.records.forEach((ele) => {this.statisticNum.push(ele.statisticNum);});}//调用处理echartsthis.initData(); })},//处理时间数据,将endTime放在第一个,其余的正序排getMonthDifference(start_date, end_date) {const start = new Date(start_date);const end = new Date(end_date);const difference = [];difference.push(end_date);//先将endTime放进去while (start < end) {const currentMonth = `${start.getFullYear()}-${(start.getMonth() + 1).toString().padStart(2, "0")}`; //补零difference.push(currentMonth);//时间小于endTime-1时结束循环start.setMonth(start.getMonth() + 1);}//difference就是除endTime的其余时间正序排列return difference;},generateCols() {const months = this.getMonthDifference(this.dateRange[0],//搜索项的startTimethis.dateRange[1]//搜索项的endTime);const cols = [];//第一列表头this.$set(cols, cols.length, {name: "客户名称",field: "customerName",//field就是el-table-column上的propalign: "center",});const chartItem = {name: "统计图",align: "center",cols: [],};//将第一块的二级表头放在统计图下if (this.incrOrstock % 3 === 0) {//下拉框值能整除3就是增量this.$set(chartItem.cols, chartItem.cols.length, {name: "增量",field: "chartIncr",//图表插槽});}if (this.incrOrstock % 2 === 0) {//下拉框值能整除2就是存量this.$set(chartItem.cols, chartItem.cols.length, {name: "存量",field: "chartStock",});}this.$set(cols, cols.length, chartItem);//跟上面一样,将二级表头放在时间一级表头下months.forEach((month) => {const newItem = {name: month,field: "month",align: "center",cols: [],};if (this.incrOrstock % 3 === 0) {this.$set(newItem.cols, newItem.cols.length, {name: "增量",field: "statisticNum." + month + "_incr",align: "center",});}if (this.incrOrstock % 2 === 0) {this.$set(newItem.cols, newItem.cols.length, {name: "存量",field: "statisticNum." + month + "_stock",align: "center",});}this.$set(cols, cols.length, newItem);});this.tableDefs.cols = cols;//放到el-table-column上},

2、实现将charts放到el-table中(主要就是想办法给你要放图标的元素指定id,因为echarts需要获取到指定元素才能初始化)

//这是在el-table中,因为我这是公共table组件,需要加一些判断来防止影响到其他页面
//html<div v-if="item.hasOwnProperty('cols')"><el-table-columnv-for="(item2, index2) in item.cols" //item就是遍历的tableData:key="index2":type="item2.type":label="item2.name":prop="item2.field":align="item.align || 'center'"><template slot-scope="scope"><divv-if="item2.field == 'chartStock'"class="chart_box":id="item2.field == 'chartStock'//重要的就是给id这,想办法给到你要展示图表的元素唯一id值? 'chart_stock_' + scope.$index: ''"></div><divv-if="item2.field == 'chartIncr'"class="chart_box":id="item2.field == 'chartIncr'? 'chart_incr_' + scope.$index: ''"></div>//这下面的判断是为了防止切换单个存量or增量时数据展示错误<div v-if="item2.field.split('_')[1] == 'stock'">{{item.cols.length == 2? scope.row.statisticNum[item.cols[1].field.split(".")[1]]: scope.row.statisticNum[item.cols[0].field.split(".")[1]]}}</div><div v-if="item2.field.split('_')[1] == 'incr' && item.cols">{{ scope.row.statisticNum[item.cols[0].field.split(".")[1]] }}</div></template></el-table-column></div>//methodsinitData() {this.$nextTick(() => {//判断是否下拉选项带着存量if (this.incrOrstock == 6 || this.incrOrstock == 2) {//this.tableDefs.pages.size就是当前table展示几条数据,我这默认是一页十条for (let i = 0; i < this.tableDefs.pages.size; i++) {let stockArr = this.statisticNum[i];let sortArr = [];//归类数组并按时间排序for (let [key, value] of Object.entries(stockArr)) {if (key.split("_")[1] == "stock") {//截取判断一下是否是存量的数据//将存量数据归类按照时间前后排序sortArr.push({ key: key, value: value });}}sortArr.sort((a, b) => {const dateA = new Date(a.key.split("_")[0]);const dateB = new Date(b.key.split("_")[0]);return dateA - dateB;});let dataArr = [];//排序完不需要key值了sortArr.forEach((ele) => {dataArr.push(ele.value); //图标需要的数据});//在el-table-column中已经定义好的id直接获取初始图标就行let myChart = echarts.init(document.getElementById("chart_stock_" + i));// 绘制图表myChart.setOption({xAxis: {type: "category",boundaryGap: false,data: [],},yAxis: {type: "value",axisLabel: {show: false, // 不显示坐标轴上的文字},splitLine: {show: false, // 不显示网格线},axisTick: {show: false, // 不显示坐标轴刻度线},},series: [{data: dataArr,type: "line",areaStyle: {},},],});//监听容器大小发生变化重绘图表const element = document.getElementById("chart_stock_" + i);const resizeObserver = new ResizeObserver((entries) => {myChart.resize();});resizeObserver.observe(element);}}//增量处理方式相同if (this.incrOrstock == 6 || this.incrOrstock == 3) {........}});},

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css背景图片属性

基础代码&#xff1a; div {width: 200px;height: 200px;background: url(./css-logo.png); }<div></div> 1、background-repeat&#xff1a;默认是repeat 设置背景图片在容器内是否平铺。 background-repeat: repeat-y; background-repeat: repeat-x; background…

MySQL Strict Mode is not set for database connection ‘default‘

在使用 DJango 框架执行迁移文件的命令时&#xff0c;可以看到出现如下警告&#xff1a; (ll_env) D:\workspace\workspace-mengll\learning-log>python manage.py migrate System check identified some issues: WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set …

Linux——进程控制(一)进程的创建与退出

目录 一、进程创建 1.写时拷贝 2.创建多个进程 二、进程终止 1.main函数的返回值 2.bash中的$? 3.自定义退出码 4.C语言的错误码 5.错误码与退出码的区别 6.代码异常终止 7.exit函数 8.总结 一、进程创建 在之前&#xff0c;我们学过linux中的非常重要的函数——…

人工智能_大模型010_Centos7.9中CPU安装ChatGLM3-6B大模型_安装使用_010---人工智能工作笔记0145

从一个空的虚拟机开始安装: https://www.modelscope.cn/models/ZhipuAI/chatglm3-6b/files 可以看到这里有很多的数据文件,那么这里 这里点击模型文件就可以下载,这个就是chatglm3-6B的文件,需要点击每个文件,然后点击右边的下载,把文件都下载下来 右侧有下载按钮.点击下载可…

android TextView 实现富文本显示

android TextView 实现富文本显示&#xff0c;实现抖音直播间公屏消息案例 使用&#xff1a; val tvContent: TextView helper.getView(R.id.tvContent)//自己根据UI业务要求&#xff0c;可以控制 图标显示 大小val levelLabel MyImgLabel( bitmap 自己业务上的bitmap )va…

阿里云中小企业扶持权益,助力企业开启智能时代创业新范式

在数字化浪潮的推动下&#xff0c;中小企业正面临着转型升级的重要关口。阿里云深知中小企业的挑战与机遇&#xff0c;特别推出了一系列中小企业扶持权益&#xff0c;旨在帮助企业以更低的成本、更高的效率拥抱云计算&#xff0c;开启智能时代创业的新范式。 一、企业上云权益…

GEE必须会教程—影像数据的区间赋值、插值与比较筛选

影像数据的操作方法比较多&#xff0c;学到今天&#xff0c;至少我们已经学会了如何定义一个影像&#xff0c;以及如何利用Image封装的函数方法进行操作。接下来&#xff0c;我们继续看Image的影像操作方法。 A.定义波段的数据格式 在编程语言中&#xff0c;我们需要根据数据…

新王炸:文生视频Sora模型发布,能否引爆AI芯片热潮

前言 前方高能预警&#xff0c;Sora来袭&#xff01; 浅析Sora的技术亮点 语言模型中构建关键词联系 视频素材分解为时空碎片 扩散模型DiT Not for play, But change world! OpenAI的宏大目标 未来已来&#xff0c;只是尚未流行 Sora的成本与OpenAI的7万亿美金豪赌 算…

【Java设计模式】二、单例模式

文章目录 0、单例模式1、饿汉式2、懒汉式3、双重检查4、静态内部类5、枚举6、单例模式的破坏&#xff1a;序列化和反序列化7、单例模式的破坏&#xff1a;反射8、单例模式的实际应用 设计模式即总结出来的一些最佳实现。GoF(四人组) 书中提到23种设计模式&#xff0c;可分为三大…

阿里云降价!云数据库277元一年,价格下调折扣对照表

2024年阿里云百款产品直降&#xff0c;平均降幅20%&#xff0c;不只是云服务器&#xff0c;也包括云数据库&#xff0c;云数据库涉及产品RDS&#xff08;MySQL、PostgreSQL、MariaDB&#xff09;、Redis社区版、MongoDB、ClickHouse社区兼容版。阿里云百科aliyunbaike.com分享阿…

使用Docker搭建一款实用的个人IT工具箱——It-Tools

作为程序员&#xff0c;在日常工作中&#xff0c;需要借助一些工具来提高我们工作效率&#xff0c;IT-Tools是为开发人员度身打造的一套便捷在线工具。它提供全面功能&#xff0c;使开发者能以更高效方式完成任务。经由IT-Tools&#xff0c;开发人员能轻松应对各类技术挑战&…

【GPU驱动开发】- AST简介

前言 不必害怕未知&#xff0c;无需恐惧犯错&#xff0c;做一个Creator&#xff01; AST&#xff0c;抽象语法树&#xff0c;是一种包含丰富语义信息的格式&#xff0c;其中包括类型、表达式树和符号等。 TranslationUnitDecl&#xff1a;该类表示一个输入源文件 ASTContext&…