已解决:vue echart 动态获取数据且定时刷新

article/2025/9/8 10:10:26

文章目录

      • 写在前面
      • 需求①
      • 需求②
      • 需求③
          • 无效的解决办法1:
          • 无效的解决办法2
          • 有效的解决办法

写在前面

我太难了,搞一个echart仪表盘,需求一步步分解:
①一开始是写死的假数据,图表成功显示在页面上;
②和后台约定数据类型格式,前台写好接口,请求后台数据,替换掉假数据给图表data赋值真实数据并成功渲染;
③我想每隔5秒调用一次请求获取数据,然后刷新图表,重新渲染出来。这里涉及到了timer定时器和watch监听数据变化的知识。
④终于在刚刚解决了。我草(一种植物)拟大爷…


需求①

先上代码:

<template><div :class="className" :style="{height:height,width:width}" />
</template><script>
import echarts from 'echarts'
require('echarts/theme/macarons') // echarts theme
import resize from './mixins/resize'export default {mixins: [resize],props: {className: {type: String,default: 'chart'},width: {type: String,default: '100%'},height: {type: String,default: '300px'},autoResize: {type: Boolean,default: true}},data() {return {}},created () {this.$nextTick(() => {this.initChart()})},beforeDestroy() {if (!this.chart) {return}this.chart.dispose()this.chart = null},methods: {initChart () {// 基于准备好的dom,初始化echarts实例this.chart = echarts.init(this.$el, 'macarons')//绘制图表,option是图表数据this.chart.setOption({title: {text: 'CPU使用情况'},tooltip: {formatter: "{a} <br/>{b} : {c}%"},series: [{name: 'cpu仪表盘',type: 'gauge',min: 0,   // 最小值max: 100,  // 最大值precision: 0,  // 小数精度,默认为0,无小数点detail: {formatter: '{value}%'},data: [{ value: 30, name: 'CPU占用率' }],}]})},}
}
</script>

再上图表:

在这里插入图片描述
到这里很简单,不用多说~


需求②

这里开始就遇到一堆问题了,总结几个问题如下:

问题① 和后台约定数据格式。 返回数据类型是什么? json对象?json字符串?
里面内容是什么,需要约定code请求码吗? (vue封装的request.js请求,判断返回成功必须有状态码,设置20000。所以得让后端返回数据内部加个code)

这里两处大的错误,随后解决。
传送门:① json解析数据问题
②数据未添加code状态码

问题② 前台写好接口,请求后台数据。 接口怎么写?如何能访问到后台?

不得不说菜的很,这里也搞了半天才成功访问到后台。
就拿我图表来说:
首先,我要在项目目录的api目录下,新建一个接口文件。比如cpu.js 具体代码如下:

import request from "@/utils/request"// 这就是接口函数
export function getCpuData() {return request({url: '/cpu',   //这是自定义的前台url,随意method: 'get',   // 获取后台数据,  get请求})
}

其次,vue.config.js文件配置你当前url访问的后台url。很重要直接决定你访问后台成不成功。来看下面关键配置:

vue.config.js

devServer: {port: port,open: true,overlay: {warnings: false,errors: true},//before: require('./mock/mock-server.js'), /*注释掉这行代码*/proxy: {'/cpu' : {target: 'xxx',  // 你的后台接口url地址changeOrigin: true,  // 跨域pathRewrite: {'^/cpu': '/cpu'}},},

这里也容易有问题,比如后台提供你的是 127.0.0.1:8081/cpu 。那在代理转发target处要写成 ‘127.0.0.1:8080/’ 语法规则会默认将 开头的 '/cpu’和target合并的。我之前就是直接写的接口地址。结果访问不到。注意一下。

第三步, 修改图表,将假数据变成调用接口获取真实数据。
直接上图表代码:

<template><div :class="className" :style="{height:height,width:width}" />
</template><script>
import echarts from 'echarts'
require('echarts/theme/macarons') // echarts theme
import resize from './mixins/resize'
import { getCpuData } from "@/api/cpu"export default {mixins: [resize],props: {className: {type: String,default: 'chart'},width: {type: String,default: '100%'},height: {type: String,default: '200px'},autoResize: {type: Boolean,default: true}},data () {return {                                                  // 改动一option: {title: {text: 'CPU使用情况'},tooltip: {formatter: "{a} <br/>{b} : {c}%"},series: [{name: 'cpu仪表盘',type: 'gauge',min: 0,   // 最小值max: 100,  // 最大值precision: 0,  // 小数精度,默认为0,无小数点detail: {formatter: '{value}%'},data: [],                        }]},}},mounted () {this.$nextTick(() => {this.initChart()})},methods: {// 初始化图表initChart () {// 基于准备好的dom,初始化echarts实例this.chart = echarts.init(this.$el, 'macarons')//绘制图表,option是图表数据                        // 改动二// let option = {//   title: {//     text: 'CPU使用情况'//   },//   tooltip: {//     formatter: "{a} <br/>{b} : {c}%"//   },//   series: [//     {//       name: 'cpu仪表盘',//       type: 'gauge',//       min: 0,   // 最小值//       max: 100,  // 最大值//       precision: 0,  // 小数精度,默认为0,无小数点//       detail: {//         formatter: '{value}%'//       },//       data: [//         { value: this.cpuData * 100, name: 'CPU占用率' }//       ],//     }//   ]// }this.drawData()                                     // 改动三//this.chart.setOption(this.option, true)},// 获取后台数据                                   // 最重要的改动四drawData () {getCpuData().then(res => {let code = res["code"]if (code == 20000) {console.log(res)this.cpuData = res["cpu"]["pct"];// 赋值给图表datathis.option.series[0].data.push({name: 'CPU占用率',value: Math.round(this.cpuData * 100)});this.chart.setOption(this.option, true)} else {alert("get failed")}console.log(this.cpuData)})},}
}
</script>

以上,跟第一版图表代码比较,里面有几处大的改动。
一. 将绘制图表的option数据从methods里拿出来放到了data()中;
二. 添加接口回调函数,绘制图表数据函数setOption放在了接口回调函数内部。

关键点:

①约定状态码,确认收到数据;
②数据格式确认,我的例子此处是json对象,故直接以数组形式就可直接赋值给临时变量;
③将临时变量的值添加到option的对应位置处。
④调用setOption绘制图表。

现在,你可以看到你的图标数据渲染就是你后台获得的真实数据
看图:
在这里插入图片描述


需求③

现在我们要每隔5秒向后台拿一次数据,然后前台重新渲染一遍。这里涉及到了定时器、watch监听、图表渲染清除上一次数据几个关键点。
查了数不清的资料一遍一遍尝试终于可以了。想流泪~~~

直接上高速:

<template><div :class="className" :style="{height:height,width:width}" />
</template><script>
import echarts from 'echarts'
require('echarts/theme/macarons') // echarts theme
import resize from './mixins/resize'
import { getCpuData } from "@/api/cpu"export default {mixins: [resize],props: {className: {type: String,default: 'chart'},width: {type: String,default: '100%'},height: {type: String,default: '200px'},autoResize: {type: Boolean,default: true}},data () {return {option: {title: {text: 'CPU使用情况'},tooltip: {formatter: "{a} <br/>{b} : {c}%"},series: [{name: 'cpu仪表盘',type: 'gauge',min: 0,   // 最小值max: 100,  // 最大值precision: 0,  // 小数精度,默认为0,无小数点detail: {formatter: '{value}%'},data: [],}]},}},watch: {// 观察cpu_option的变化option: {handler(newVal, oldVal) {this.timer()this.destroyed()},deep: true   //对象内部属性的监听},},mounted () {this.$nextTick(() => {this.initChart()})},methods: {// 初始化图表initChart () {// 基于准备好的dom,初始化echarts实例this.chart = echarts.init(this.$el, 'macarons')this.drawData()},// 获取后台数据drawData () {getCpuData().then(res => {let code = res["code"]if (code == 20000) {console.log(res)this.option.series[0].data = []         // 这里涉及致命问题,下面解释this.cpuData = res["cpu"]["pct"];// 赋值给图表datathis.option.series[0].data.push({name: 'CPU占用率',value: Math.round(this.cpuData * 100)});//绘制图表数据this.chart.setOption(this.option, true)} else {alert("get failed")}console.log(this.cpuData)})},//这是一个定时timer () {return setTimeout(() => {this.drawData()}, 5000)},// 销毁定时器destroyed () {clearTimeout(this.timer())}}
}
</script>

我直接说如何每次刷新图表都清除上一次渲染的数据。

无效的解决办法1:
this.chart.setOption(option,true)  无效
无效的解决办法2
this.chart.clear()   无效
有效的解决办法
this.option.series[0].data = []

即在下一次获取数据渲染图表前先将上一次赋的数据清空!!!!!

否则,你会看到,一个仪表盘百分比一直保持第一次获取数据不变,而指针每5秒增加一个,最后成了千手观音,那画面简直太美。。。


以上就是我所一路坎坷总结。如有不成熟的地方还请谅解。如有更好的解决办法还请不吝赐教。我虚心好学~


http://chatgpt.dhexx.cn/article/ALUHUacY.shtml

相关文章

Python绘制柱状图之可视化神器pyecharts(二)

目录 主题介绍 图表参数 主题详解 柱状图模板系列 海量数据柱状图动画展示 收入支出柱状图&#xff08;适用于记账&#xff09; 我们在日常的生活中&#xff0c;有收入也有支出&#xff0c;这个模板就是把收入和支出直观的展示在读者面前。 三维数据叠加 柱状图与折线…

day07 pyecharts制图

目录 Python配置安装pyecharts 一、柱状图的使用二、折线图三、饼图四、地图五、词云六、组合图 Python配置安装pyecharts Python配置国内镜像源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pycharm配置pyecharts 一、柱状图的使用 # 导入…

vue-echarts主题切换+选择面板实现

通过实现主题选择面板&#xff0c;更方便的对echarts图表进行主题的切换&#xff0c;并且支持饼状图、折线图、柱状图等多类型echarts图表。 目录 1、实现过程 1.1、导入echarts主题JS文件 1.2、添加选择按钮图片 1.3、添加按钮 1.4、主题选择面板实现 1.5、初始化echart…

echarts 2.0 macarons主题安装

2019独角兽企业重金招聘Python工程师标准>>> 主题下载: http://echarts.baidu.com/doc/example/theme/macarons.js 其他主题改名字就好了.[无责任猜测] 这里采用AMD加载方式 [博主用的是requirejs] 在main.js中 require.config({paths:{echarts:js/echarts/echarts…

魔法值及魔法值处理方法

魔法值 什么是魔法值 所谓的魔法值就是在代码中直接出现的数字。   PS&#xff1a;代码中有魔法值会造成代码可读性低&#xff08;与代码量成正比&#xff09;。还会造成维护困难&#xff0c;改动一个数值便要大动干戈&#xff0c;牵一发而动全身。应当尽力消灭或减少魔法值…

别让【魔法值】毁了你的代码!

二分钟&#xff0c;教你一个写代码的好习惯。 大家好&#xff0c;我是鱼皮&#xff0c;今天通过一件事情&#xff0c;分享写代码时的一个重要小技巧。 前段时间&#xff0c;我在编程导航项目中开源了一段代码&#xff0c;实现的功能是&#xff0c;当用户的操作失败时&#xff…

【java】万恶的魔法值

在最近的小云通知项目中&#xff0c;我负责维护后端的开发&#xff0c;也是深刻体会到用魔法值会给维护人员带来多大的痛苦&#xff01;可谓一个bug改一天…… 文章目录 什么是魔法值怎么处理魔法值 什么是魔法值 首先我们说一下什么是魔法值&#xff0c;所谓魔法值&#xff0…

什么是java中的魔法值

自从在idea上用了 《阿里巴巴Java开发手册》的插件之后 这里附上对应的插件安装方法&#xff1a;https://developer.aliyun.com/article/224817 偶然发现自己的代码中出现了所谓的 “魔法值” 什么是魔法值呢 所谓魔法值&#xff0c;就是在代码中直接出现的数值&#xff0c;只…

Java中的魔法值和解决方法

目录 一、什么是魔法值 二、解决方法 一、什么是魔法值 魔法数值、魔法数字、魔法值&#xff0c;这是一个东西&#xff0c;不同的叫法。 所谓魔法值&#xff0c;是指在代码中直接出现的数值&#xff0c;只有在这个数值记述的那部分代码中才能明确了解其含义&#xff0c;数字…

java 不要使用魔法值_为什么阿里巴巴Java开发手册中不允许魔法值出现在代码中?...

武培轩 推荐搜索 JavaSpring Boot数据结构MySQLElasticsearchNginx 在阅读《阿里巴巴Java开发手册》时&#xff0c;发现有一条关于关于常量定义的规约&#xff0c;具体内容如下&#xff1a; 图中的反例是将数据缓存起来&#xff0c;并使用魔法值加链路 id 组成 key&#xff0c;…

java 项目减少魔法值_项目代码中魔法值的优雅处理

经常在代码里面会用一些表示有意义的数字&#xff0c;但是如果不写注释的话&#xff0c;过了一段时间我们自己再回去优化代码的时候&#xff0c;可能自己也不清楚这些数字表示的是什么意思了。 如果写注释的话&#xff0c;就要每次使用数字的时候都要写注释了&#xff0c;这样的…

java 魔法值_Java 开发技巧:减少魔法值的使用

1. 前言 重构老代码中遇到了类似这种写法&#xff1a; public void attend(String value){ if ("0".equals(value)) { //todo } else if ("1".equals(value)) { //todo } else { //todo } } 脑壳疼&#xff01;从 Java 语法上无懈可击&#xff0c;但是从业…

IDEA快速去除魔法值

背景 写代码有的时候为了方便&#xff0c;会在代码里面留下很多字符串之类的变量。这种便便会被定义为魔法值。 这种变量正常来讲不影响阅读的。所以一般情况下&#xff0c;我们都不会去处理它。 但是当项目越来越大的时候&#xff0c;我们发现很多地方都有可能使用了同一个…

魔法值与解决办法

1.什么是魔法值 魔法值是指代码中突然出现的数字&#xff0c;之所以称为魔法值&#xff0c;是因为这个20可以有多种意义。在新来的员工接手你的代码时&#xff0c;他们产生疑问&#xff1a;为什么要设这个20&#xff0c;背后有什么秘密吗。大大降低了代码的可维护性。 2.解决办…

java怎么字符连接换行_Java中的换行、转义字符和连接字符-Go语言中文社区

语句输出的换行 我们之前完成了我们的第一个Java输出语句&#xff0c;接下来我们可以做一个简单的输出换行与不换行操作。 例如&#xff1a;我们输出天王盖地虎和宝塔镇河妖 public class Demo1 { public static void main(String[] args) { System.out.println("天王盖地…

java csv 换行_javacsv如何换行输入

javacsv如何换行输入 [2021-02-10 01:25:25] 简介: php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐:《PHP视频教 java怎么输入换行…

java输出流怎样换行_Java中输出流续写和换行写方法,需要用到的构造方法的知识点...

/* FileOutputStream​(String name, boolean append) 创建文件输出流以指定的名称写入文件。 FileOutputStream​(File file, boolean append) 创建文件输出流以写入由指定的 File对象表示的文件。 创建指定File对象表示的文件中写入数据的文件输出流 构造方法的参数: String …

Java输入换行结束

问题出现 &#xff1a; 我在写一个程序的时候&#xff0c;会发现当我想要用while()循环得到一组数字的时候&#xff0c;不加控制条件while()循环就不会停止。 Scanner scanner1 new Scanner(System.in);while(scanner1.hasNext()){System.out.println(scanner1.nextInt());} …

java中的换行

纯copy的 \r return 到当前行的最左边 \n newline 向下移动一行&#xff0c;并不移动左右。 \r\n &#xff08;"\r"&#xff0c;"\n"和"\r\n"&#xff09;&#xff0c;导致输出结果可能出现错误或不一致。建议在代码中统一使用一个…

Java中换行输出的两种方法

效果&#xff1a; 方法一&#xff1a; public class ChairMan{public static void main(String[] args){System.out.printlin("姓名&#xff1a;法外狂徒");System.out.printlin("性别&#xff1a;男");System.out.printlin("家庭住址&#xff1a;北…