vue echarts实现月度年度可切换,自适应的柱状统计图功能

news2024/11/24 10:54:58

echarts配置文档参考:Documentation - Apache ECharts

功能:可进行月度、年度切换显示相应的收入和支出柱状图数据;

这里进行了柱状图的简化配置,X轴Y轴都有所改写,具体的简化配置下文会贴出代码,参照功能开发时按照自己的需要去处理;

这里也会提到在开发时会遇到的问题,以及延伸配置的其他功能介绍;

 实现效果

页面代码

<div>
      <van-tabs color="#0050e9" v-model="active" v-throttle  @click="changeTab" title-active-color="#0050e9" class="tabFixed">
        <van-tab title="月度" name="1"> </van-tab>
        <van-tab title="年度" name="2" :disabled="ndDisabled"> </van-tab>
      </van-tabs>
      <div class="tabMain plr30">
        <div class="inContent mt20">
          <div id="incomeEcharts" style="width: 100%;height:400px;"></div>
        </div>
      </div>
</div>
        

月度年度切换方法

changeTab(name) {
        this.active = name;
        this.incomeDataValue = [];
        this.incomeDataX = [];
        this.expendDataValue = [];
        //柱状图接口方法
        this.getLineChat();
        
},

柱状图调用接口方法

1.根据自己的项目需要,传递参数,供参考;

2.针对收支、支出数据需要进行处理;

3.绘制柱状图;

绘制柱状图方法:drawIncomeBar()

 接口返回的数据的结果:

getLineChat() {
        let params = {
          "carrierUserId": this.id,
          "collectionDate": this.active == "1" ? this.selectTime + "-01" : this.selectTime + "-01-01",
          "mmsi": this.mmsi,
          "type": this.active
        }
        this.incomeDataValue = [];
        this.incomeDataX = [];
        this.expendDataValue = [];
        lineChat(params).then(res => {
          if (res.code == 200) {
            console.log(res);
            // 收支
            res.data.incomeData.forEach((val, index) => {
              this.incomeDataValue.push(val.amount)
              this.incomeDataX.push(this.active == "1" ? val.dayOrMonth + "日" : val.dayOrMonth + "月"); //日期
            });
            // 支出
            res.data.expenditureData.forEach((val, index) => {
              this.expendDataValue.push(val.amount);
            });

            this.drawIncomeBar();
          }
        })
},

绘制柱状图方法

drawIncomeBar()

drawIncomeBar() {
        let incomeChart = this.$echarts.getInstanceByDom(document.getElementById("incomeEcharts"));
        if (incomeChart == null) {
          this.incomeEcharts = this.$echarts.init(document.getElementById("incomeEcharts"));
        }
        this.incomeOption = {
          title: {
            x: 'left',
            text: "收支趋势"
          },
          grid: {
            left: '0',
            right: '1%',
            bottom: '0',
            containLabel: true,
          },
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'shadow'
            },
            formatter: (params) => {
              if (params.length == 1) {
                if(params[0].data>=0){
                  return params[0].name + '<br>' +
                    params[0].marker + params[0].seriesName + ': ' + params[0].data + '元'
                }
                  
              } else {
                if(params[0].data>=0&&params[1].data>=0){
                  return params[0].name + '<br>' +
                  params[0].marker + params[0].seriesName + ': ' + params[0].data + '元' + '<br>' +
                  params[1].marker + ' ' + params[1].seriesName + ': ' + params[1].data + '元'
                }
                
              }
            }


          },
          color: ['#52CCA3', '#6699FF'],
          xAxis: {
            data: this.incomeDataX,
            axisTick: {
              show: false
            },
            axisLine: {
              show: false
            },
            splitLine: {
              show: false
            },
          },
          yAxis: {
            name: "",
            type: "value",
            minInterval: 5,
            axisTick: {
              show: false
            },
            axisLine: {
              show: false
            },
            splitLine: {
              show: false
            },
            axisLabel: {
              formatter: function () {
                return "";
              }
            }
            // axisLabel:{
            //   formatter:function(value){
            //     if(value == 0){
            //       return '\n'+ value +"\n日期"
            //     }
            //     return value

            //   }
            // }
            // interval:10
          },
          series: [{
              name: "收入",
              type: "bar",
              // barWidth: 20, // 柱子宽度
              data: this.incomeDataValue,
              // stack: "Total",
              label: {
                show: false,
                position: 'top',
                formatter: function (num) {
                  if (num.value > 0) {
                    return num.value;
                  } else {
                    return ""
                  }
                }
              },
              itemStyle: {
                // color:"#52CCA3"
                borderRadius: [10, 10, 0, 0],
              }

            },
            {
              name: "支出",
              type: "bar",
              // barWidth: 20, // 柱子宽度
              data: this.expendDataValue,
              // stack: "Total",
              label: {
                show: false,
                position: 'top',
                formatter: function (num) {
                  if (num.value > 0) {
                    return num.value;
                  } else {
                    return ""
                  }
                }
              },
              itemStyle: {
                // color:"#6699FF"
                borderRadius: [10, 10, 0, 0],
              }

            }

          ],
          toolbox: {
            feature: {
              saveAsImage: {
                show: false
              },
            },
          },
          legend: {
            itemWidth: 20,
            x: 'right',
          },
          // 拖拽X轴
          // dataZoom: [
          //   {
          //     type: "slider",//inside鼠标缩放
          //     show: true,
          //     start: 0,
          //     end: 80,
          //     xAxisIndex: [0],
          //     // backgroundColor: 'rgba(154,188,255,.5)'
          //     // dataBackgroundColor: '#eee'
          //     // fillerColor: 'rgba(144,197,237,0.2)'
          //     handleColor: 'rgba(70,130,180,0.8)'
          //   }
          // ],
        };
        this.incomeEcharts.setOption(this.incomeOption);
},

值得注意的地方,记得

this.incomeEcharts.setOption(this.incomeOption);

tooltip弹窗的处理 

自定义弹窗内容显示,需要的注意的就是内容换行的添加,以及对返回的数据的处理

tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'shadow'
            },
            formatter: (params) => {
              if (params.length == 1) {
                if(params[0].data>=0){
                  return params[0].name + '<br>' +
                    params[0].marker + params[0].seriesName + ': ' + params[0].data + '元'
                }
                  
              } else {
                if(params[0].data>=0&&params[1].data>=0){
                  return params[0].name + '<br>' +
                  params[0].marker + params[0].seriesName + ': ' + params[0].data + '元' + '<br>' +
                  params[1].marker + ' ' + params[1].seriesName + ': ' + params[1].data + '元'
                }
                
              }
            }

},

拖拽X轴功能

// 拖拽X轴
dataZoom: [
    {
               type: "slider",//inside鼠标缩放
               show: true,
               start: 0,
               end: 80,
               xAxisIndex: [0],
               // backgroundColor: 'rgba(154,188,255,.5)'
               // dataBackgroundColor: '#eee'
               // fillerColor: 'rgba(144,197,237,0.2)'
               handleColor: 'rgba(70,130,180,0.8)'
     }
],

页面效果:

 数据加载

created() {
    this.getLineChat(); //统计图
}

实现柱状图自适应功能

mounted() {
      const elementResizeDetectorMaker = require("element-resize-detector");
      let erd = elementResizeDetectorMaker();
      erd.listenTo([document.getElementById("incomeEcharts")], () => {
        this.$nextTick(() => {
          this.incomeEcharts = this.$echarts.init(document.getElementById("incomeEcharts"));
          this.incomeEcharts.resize();
        });
      });

}

element-resize-detector监听元素宽度变化

  • 安装element-resize-detector
npm install element-resize-detector --save

问题总结:

1.在切换数据的时候,手机端可能会出现数据未及时响应,切换太快数据错乱的问题,

解决办法可以选择在进入页面的时候,先默认禁止年度按钮,使用定时器延迟加载,数据加载完成,取消禁止状态;

2.增加防抖功能,避免切换数据时数据加载效率问题

3.对接口做axios中断请求

4.关于echarts详细配置问题:echarts 各个配置项详细说明总结_echarts label配置_船长在船上的博客-CSDN博客

⭐️  作者:船长在船上
🚩 主页:来访地址船长在船上的博客

🔔  感谢:CSDN前端领域博客专家,CSDN前端领域优质创作者,资深前端开发工程师,专注web前端领域开发,在CSDN分享工作中遇到的问题以及问题解决方法和对项目开发的实际案例总结以及新技术的认识。  

发文不易,点赞、收藏、评论、关注一下呗! 
————————————————
版权声明:本文为CSDN博主「船长在船上」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

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

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

相关文章

LiveGBS流媒体平台GB/T28181功能-支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放

LiveGBS支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放 1、背景2、分屏展示3、选择轮播通道4、配置轮播间隔(秒)5、点击开始轮播6、轮播停止及全屏7、搭建GB28181视频直播平台 1、背景 视频监控项目使用过程中&#xff0c;有时需要大屏值守&#xff0c;值守的时候多分…

(学习笔记-IP)Ping的工作原理

Ping是基于ICMP协议工作的&#xff0c;ICMP报文封装在IP包里面&#xff0c;它工作在网络层&#xff0c;是IP协议的助手。 ICMP包头的类型字段&#xff0c;大致可分为两大类&#xff1a; 一类是用于诊断的查询消息&#xff0c;也就是查询报文类型一类是通知出错原因的错误消息&…

PDF添加水印以及防止被删除、防止编辑与打印

方法记录如下&#xff1a; 1、添加水印&#xff1b; 2、打印输出成一个新的pdf&#xff1b; 3、将pdf页面输出成一张张的图片&#xff1a;&#xff08;福昕pdf操作步骤如下&#xff09; 4、将图片组装成一个新的pdf&#xff1a;&#xff08;福昕pdf操作步骤如下&#xff09;…

C# 使用opencv从图片识别人脸示例

1.用chatgpt帮我写了一个示例 using System; using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Structure;class Program {static void Main(string[] args){// 加载人脸分类器CascadeClassifier faceCascade new CascadeClassifier("haarcascade_frontalface_defau…

Kafka基础架构与核心概念

Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。架构特点是分区、多副本、多生产者、多订阅者&#xff0c;性能特点主要是…

测试人必看:五大维度解读软件测试分类

软件测试方法种类繁多&#xff0c;记忆起来也非常混乱&#xff0c; 如果把软件测试方法进行多个维度的分类, 就会清晰很多。 软件测试的分类-按开发阶段分类 单元测试 又称模块测试&#xff0c;针对软件设计中的最小单位-程序模块&#xff0c;进行正确性检查的测试工作。单元…

谷粒商城第五天-将项目改为基于若依框架实现、使用若依进行代码生成(生成MyBatisPlus风格)

目录 一、使用若依框架来搭建后台管理系统 1.1 前端部分 1.2 后端部分 1.2.1 将若依框架植入到项目中 1.2.2 完成数据库配置 二、使用若依框架的逆向生成工具逆向生成代码&#xff08;同时将代码风格改为MyBatisPlus&#xff09; 2.1 使用若依框架提供的逆向生成工具生成…

思科路由器交换机密码破解教程

1. 路由器密码的恢复. 2600、3600等新系列路由器步骤&#xff1a; 1、启动路由器&#xff0c;60秒内按下ctrlbreak键2、rommon>confreg 0x21423、rommon>reset4、router#copy startup-config running-config5、router(config)#no enable secrect //可以删除密码也可以更…

linux升级mysql

linux升级mysql 一.介绍二.下载三.文件配置1.查找删除mysql2.解压配置 四.修改配置五.初始化mysql服务六.启动mysql七.配置数据库七.测试 一.介绍 由于最近业务需要&#xff0c;不得不将之前的mysql5.7.26升级到mysql8.0加了 Linux安装mysql&#xff08;5.7.26&#xff09;&…

浅谈SSM框架理论相关知识_kaic

一、SSM框架简介 SSM框架是Spring MVC &#xff0c;Spring和Mybatis框架的整合&#xff0c;是标准的MVC模式&#xff0c;将整个系统划分为View层&#xff0c;Controller层&#xff0c;Service层&#xff0c;DAO层四层&#xff0c;使用Spring MVC负责请求的转发和视图管理&…

项目管理:甘特图制定项目计划,提高项目管理效率

项目实施周期长&#xff0c;工作范围广&#xff0c;不确定因素多&#xff0c;因此项目管理具有巨大的挑战性。 项目经理需要具备专业的知识能力和个人应变能力&#xff0c;以管理整个项目的实施过程&#xff0c;提高项目实施的成功率和管理效率。 现在&#xff0c;随着社会市…

opencv-16 图像去水印示例

常用的去水印方法&#xff1a; 克隆修复工具&#xff1a;使用图像处理软件&#xff08;如Photoshop&#xff09;中的克隆修复工具可以选择一个样本区域&#xff0c;然后将其复制到水印区域&#xff0c;以覆盖水印。这种方法在简单的水印上可能效果不错&#xff0c;但复杂的水印…

CMU 15-445 -- Concurrency Control Theory - 13

CMU 15-445 -- Concurrency Control Theory - 13 引言TransactionsStrawman/Simple SystemFormal DefinitionsAtomicityLoggingShadow Paging ConsistencyIsolationConflicting OperationsDependency Graphs&#xff08;依赖图&#xff09;VIEW SERIALIZABILITY(视图可串行化) …

配置SQL提示

问题描述 SpringBoot工程中&#xff1a;使用Select注入的时候没有提示 例如&#xff1a; 在正常情况下&#xff1a; 在没有配置SQL提示的时候&#xff1a; 原因分析&#xff1a; 没有进行SQL配置 解决方案&#xff1a; 选中Select注入中的SQL语句&#xff0c;使用IDEA中的快…

第二天 kali代理配置

文章目录 环境一、虚拟机网络模式&#xff08;1&#xff09;NAT&#xff08;2&#xff09;NAT模式&#xff08;3&#xff09;桥接模式&#xff08;4&#xff09;仅主机模式&#xff08;5&#xff09;总结 二、配置代理&#xff08;桥接模式&#xff09;1、基础设置2、虚拟机浏览…

GO语言安全工具开发方向探索

声明&#xff1a;文章所涉及的代码进攻参考和学习&#xff0c;文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与教学之用&#xff0c;读者将其信息做其他用途&#xff0c;由用户承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 文章目录…

ubuntu环境安装centos7虚拟机网络主机不可达,ping不通

【NAT模式下解决】1.首先vi /etc/sysconfig/network-scripts/ifcfg-ens33检查ONBOOTyes&#xff0c;保存 2.输入systemctl restart network命令重启网关

数据结构【排序】

第七章 排序 一、排序 1.定义&#xff1a;将无序的数排好序 &#xff1b; 2.稳定性&#xff1a; Kᵢ和Kⱼ中&#xff0c;Kᵢ优先于Kⱼ那么在排序后的记录中仍然保持Kᵢ优先&#xff1b; 3.评价标准&#xff1a;执行时间和所需的辅助空间&#xff0c;其次是算法的稳定性&#xf…

三,创建订单微服务消费者 第三章

4.3 修改pom添加依赖 <dependencies><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--监控--><dependency><groupId&g…

ssm笔记

1.IOC和DI配置文件开发 spring&#xff0c;主要内容有两点&#xff1a;IOC&#xff0c;AOP。AOP里面spring独到的事务处理。 理清spring框架设计思想 1.1.Spring Framework系统架构 spring4架构图 系统架构讲究上层依赖于下层 Data Access&#xff1a;数据访问Data Inte…