echarts 清空上一次加载的数据

目标效果及数据格式

echarts目标链接

在这里插入图片描述

后台数据格式

在这里插入图片描述

Json中List类型,并遍历List中的对象

  for(var i in sigleRow)
    {
       chargingPowerList.push(sigleRow[i].chargingPower);
       drivingMileageList.push(sigleRow[i].drivingMileage);
       numList.push(sigleRow[i].num);
     }

转化后格式:

在这里插入图片描述

myChart.setOption(option,true)

series虽然是[] 数组,但是任然会保留上次查询所得结果,使用myChart.setOption(option,true)语句可以更新页面效果

如果这种方式没有解决,可以参考下文,使用setOption

最终效果

在这里插入图片描述

完整代码如下:

      countCollum(flag){
        var ydata = {};
        var linename = {
          xname:'',
          yname:''
        };
        
        let lengendName = [];// echart legend
        let chargingPowerObj = [],drivingMileageObj = [],numObj = [];
        this.listData.forEach((element,index) => {
          lengendName.push(element.carName);
          var sigleRow = eval(element.workVehicleStatisticsList);
          let chargingPowerList = [];
          let drivingMileageList = [];
          let numList = [];
        
          for(var i in sigleRow)
          {
            chargingPowerList.push(sigleRow[i].chargingPower);
            drivingMileageList.push(sigleRow[i].drivingMileage);
            numList.push(sigleRow[i].num);
          }
          chargingPowerObj.push(chargingPowerList);
          drivingMileageObj.push(drivingMileageList);
          numObj.push(numList);
        });
          console.log('element-11-',chargingPowerObj,drivingMileageObj)
        if(flag == 'countnum'){
          ydata = numObj;
          linename.xname = '统计时间';
          linename.yname = '次数/次';
          this.moveCarCountLine(numObj,linename,lengendName);
    
        }else if(flag == 'countkwh'){
          this.fiveOpera = '';
          linename.xname = '统计时间';
          linename.yname = '电量/度';
          ydata = chargingPowerObj;
          this.moveCarCountLine(chargingPowerObj,linename,lengendName);

        }else if(flag == 'countkm'){
          this.fiveOpera = '';
          linename.xname = '统计时间';
          linename.yname = '里程/公里';
          this.moveCarCountLine(drivingMileageObj,linename,lengendName);
        }else{
          ydata = [];
        }

        chargingPowerObj = [];
        drivingMileageObj = [];
        numObj = [];
      },
	moveCarCountLine( ydata, linename,lengendName) {
        let _this = this;
        var moveCarCount = _this.$echarts.init(document.getElementById("moveCarCountInfoId"));
        var areaChargeOpt = {
          tooltip : {
              trigger: 'axis',
              axisPointer : {            // 坐标轴指示器,坐标轴触发有效
                  type : 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
              }
          },
          legend: {
              data: lengendName
          },
          grid: {
              left: '3%',
              right: '4%',
              bottom: '3%',
              containLabel: true
          },
          yAxis:  {
              type: 'value'
          },
          xAxis: {
              type: 'category',
              data: _this.xzhouname
          },
          series: _this.seriesData(ydata,lengendName)
        };
        moveCarCount.setOption(areaChargeOpt,true);
      },
      seriesData( ydata, lengendName){
        console.log('seriesData', ydata,lengendName)
        var series = [];
        ydata.forEach((element,index) => {
        console.log('seriesDataelement',element)
          let item = {
            name: lengendName[index],
            type: 'bar',
            stack: '总量',
            label: {
                normal: {
                    show: true,
                    position: 'insideRight'
                }
            },
            data: ydata[index]
          }
          series.push(item);
        })
        console.log('seriesDataseriesData',series)
        return series;
      },

Echarts清空图表:There is a chart instance already initialized on the dom.

有一个关于dom的图表实例已初始化

我们在使用图表的时候,常用的使用场景就是数据展示。

我们自然希望,数据的改变会带来图表的重绘。

也就是说,指定的区域作为canvas容器,根据触发条件改动数据之后,依旧沿用之前的的图表配置,把图表重新生成。

重绘图表时,我们要把之前已经渲染好的图表清空。

Echarts提供的有clear()和dispose()方法。

另外还有js方法。

先说我用着无效的两个

①js:

let ele=element.getElementById('元素id');
ele.innerHTML=''

这是把canvas元素的内容清空,视觉效果上,确实实现了清空。

但是canvas实例依旧存在,控制台就会出现上面的问题:There is a chart instance already initialized on the dom.

②clear()方法

let ele=element.getElementById('元素id')
ele.clear()

官方解释是:

清空当前实例,会移除实例中所有的组件和图表。

看定义我是觉得能实现需求的,但实际用的时候效果不尽人意。

注:这里我也查找了很多资料,来佐证方法的适用性。有的朋友记录该方法确实可用,但是有的就和我一样,没有作用。

不过,可能是使用方法的位置不正确,导致方法没有合适的被使用也说不一定。

以上是问题记录,接下来说一下解决方案吧。

dispose()方法:

销毁实例,实例销毁后无法再被使用。

实话讲,看见官方的这个解释,我在最初的时候根本没考虑用它。

原因就是销毁二字,我想当然,图表我还需要用,你销毁再用的时候怎么获取呢?

后来其他方案确实没办法解决已初始化的问题,我又看了一下自己使用图表的方法:

let chart = echarts.init(this.$refs.chart);

init()!!!

创建一个 ECharts 实例,返回 echartsInstance,不能在单个容器上初始化多个 ECharts 实例。

所以切换数据,显示不同图表的过程其实也就是 ECharts 实例的销毁—创建过程。

自然而然,想到dispose()销毁方法,可问题是我们什么时候使用呢?

能销毁肯定需要先存在,所以定义一个全局变量来存储创建后的ECharts 实例,在改变数据需要重新绘制图表的时候加上条件判断:图例是否存在来决定是否销毁。

所以呢:

我在data里定义:

chart: null,//接收实例对象

触发切换数据的方法里面:

if (this.chart != null && this.chart != '' && this.chart != undefined) {
   this.chart.dispose(); //销毁
}

嘎嘎好用!

不过我在想,上面clear()方法没用,或许是实例没保存,触发时机不对。

按照正确的处理思路,dispose()换成clear()可能也好用。(有时间我试一下,再来更新) 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。

关于echarts 清空上一次加载的数据问题的更多相关文章

  1. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  2. vue自定义加载指令v-loading占位图指令v-showimg

    这篇文章主要为大家介绍了vue自定义加载指令和v-loading占位图指令v-showimg的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  3. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  4. 如何在PHP环境中使用ProtoBuf数据格式

    这篇文章主要介绍了如何在PHP环境中使用ProtoBuf数据格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  5. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  6. Android本地存储方法浅析介绍

    这篇文章主要介绍了Android本地存储案例,方法简单可以实现存储并达到节省内存的效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  7. 详解Python如何实现Excel数据读取和写入

    这篇文章主要为大家详细介绍了python如何实现对EXCEL数据进行读取和写入,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  8. Python自动化办公之Excel数据的写入

    这篇文章主要为大家详细介绍一下Python中excel的写入模块- xlsxwriter,并利用该模块实现Excel数据的写入,感兴趣的小伙伴可以了解一下

  9. JavaScript数据扁平化详解

    这篇文章主要为大家介绍了JavaScript数据扁平化,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

  10. Python数据分析之PMI数据图形展示

    这篇文章主要介绍了Python数据分析之PMI数据图形展示,文章介绍了简单的python爬虫,并使用numpy进行了简单的数据处理,最终使用 matplotlib 进行图形绘制,实现了直观的方式展示制造业和非制造业指数图形,需要的朋友可以参考一下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部