Echarts动态加载数据

xiaoxiao2021-02-28  53

  在为写这个项目之前,并没有大范围的写过前端,这次也是锻炼了,由于项目需求,要求echarts图动态加载数据(定时加载),一下是我在网上看到的例子,在此基础上做了修改,实现了功能。但觉得还有很多需改进和学习的地方。

使用window.setInterval自动刷新数据

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="divProgress" style="width: 600px;height:400px;"></div> <script src="http://cdn.staticfile.org/jquery/2.1.1-rc2/jquery.min.js"></script> <script src="http://echarts.baidu.com/build/dist/echarts.js"></script> <script type="text/javascript"> var myChart; // 路径配置 require.config({ paths: { echarts: 'http://echarts.baidu.com/build/dist' } }); // 使用 require( [ 'echarts', 'echarts/chart/bar' // 使用柱状图就加载bar模块,按需加载 ], function (ec) { // 基于准备好的dom,初始化echarts图表 myChart = ec.init(document.getElementById('divProgress')); var option = { tooltip: { show: true }, animation: false, legend: { data: ['销量'] }, xAxis: [ { type: 'category', data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] } ], yAxis: [ { type: 'value' } ], series: [ { "name": "销量", "type": "bar", "data": [5, 20, 40, 10, 10, 20] } ] }; // 为echarts对象加载数据 myChart.setOption(option); } ); //这里用setTimeout代替ajax请求进行演示 //3s刷新一次 window.setInterval(function () { var data = [0, 0, 0, 0, 0, 0]; refreshData(data); },3000); function refreshData(data){ if(!myChart){ return; } //更新数据 var option = myChart.getOption(); option.series[0].data = data; myChart.setOption(option); } </script> </body> </html>  我认为这种方法存在一种弊端。如:在你设置的刷新时间较短的时候并未发现弊端,一旦设置刷新时间较长的话(如2min),很容易就会发现,在首次加载页面的时候并不能立即展示出数据,而是要经过刷新的时间间隔(2min)后,echarts方可展现。对此,我做了修改,修改之后的代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <!-- 引入 echarts.js --> <script type="text/javascript" src="js/echarts.min.js"></script> <!-- 引入jquery.js --> <script type="text/javascript" src="js/jquery-2.1.1.min.js"></script> <script type="text/javascript" src="js/jquery.loading.js"></script> </head> <body> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 column"> <div class="panel info-list" id="solrsumPanel"> <div class="panel-heading"> <span class="panel-title">响应时间</span> </div> <div class="panel-body graph" style="height: 400px;" id="solrsumChart"></div> </div> </div> <script type="text/javascript"> var drawsolr = function() { // 基于准备好的dom,初始化echarts实例 $('#solrsumPanel').showLoading()// 显示loading效果,同时关闭提示消息 var myChart = echarts.init(document.getElementById('solrsumChart')); $.ajax({ type : 'get', url : "data.json", data : { }, success : function(data) { $.each(data.dateTime, function(i, d) { data.dateTime[i] = data.dateTime[i].substring(0, 10) + ' -' + data.dateTime[i].substring(11, 19);// 截取日期 }); var date3 = []; var nums = []; var datalist = []; var times = []; for (var i = 0; i < data.dateTime.length; i++) { date3.push(data.dateTime[i]); datalist.push(data.nums[i]); times.push(data.cost[i]); } $('#solrsumPanel').hideLoading() // 指定图表的配置项和数据 var option = { tooltip : { trigger : 'axis', axisPointer : { type : 'cross', label : { backgroundColor : '#283b56' } } }, toolbox : { show : true, feature : { dataView : { readOnly : false }, restore : {}, saveAsImage : {} } }, xAxis : [ { type : 'category', boundaryGap : true, data : data.dateTime, nameLocation : 'middle' } ], yAxis : [ { type : 'value', scale : true, name : '数量', boundaryGap : [ 0.2, 0.2 ], axisLabel : { formatter : '{value} 条' } }, { type : 'value', scale : true, name : '时间', boundaryGap : [ 0.2, 0.2 ], splitLine : { show : false }, axisLabel : { formatter : '{value} ms' } } ], dataZoom : [ { show : true, realtime : true, start : 65, end : 85 }, { type : 'inside', realtime : true, start : 65, end : 85 } ], series : [ { name : '数量', type : 'bar', data : data.nums }, { name : '时间', type : 'line', yAxisIndex : 1, data : data.cost } ] }; myChart.setOption(option); }, error : function(XMLHttpRequest) { $('#solrsumPanel').hideLoading(); $('#solrsumPanel').msg({ type : 'danger', text : "查询数据出错,请联系管理人员!" }); } }); } $(function() { drawsolr(); }); //一分钟刷新一次 setInterval(function() { drawsolr(); }, 60000); </script> </body> </html>json数据格式如下: { "dateTime": [ "2017-05-05 00:10:02Z", "2017-05-05 00:20:02Z", "2017-05-05 00:30:02Z", "2017-05-05 00:40:02Z", "2017-05-05 00:50:02Z", "2017-05-05 01:00:02Z", "2017-05-05 01:10:02Z", "2017-05-05 01:20:02Z", "2017-05-05 01:30:02Z", "2017-05-05 01:40:02Z", "2017-05-05 01:50:02Z", "2017-05-05 02:00:02Z", "2017-05-05 02:10:02Z", "2017-05-05 02:20:02Z", "2017-05-05 02:30:02Z", "2017-05-05 02:40:02Z" ], "nums": [ 91, 90, 89, 89, 89, 87, 89, 89, 85, 87, 85, 87, 89, 85, 87, 87 ], "cost": [ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null ] } 这种方法虽然解决了上述的问题,但还是有不足的地方,例如:在动态加载数据的时候并不是局部(柱状折线)刷新,而是整张图都刷新,没有做到很好的数据实时推送。这一部分可以通过长轮询进行实现。后续会做进一步补充,今天就先到这儿吧......
转载请注明原文地址: https://www.6miu.com/read-41775.html

最新回复(0)