使用echarts遇到的坑

781 阅读5分钟

关于eacharts在使用出现的问题

1.立体柱状图的展示问题

图表使用的是pictorialBar做的立体柱状图

具体的结构是

series: [

    {

    name: "成交量",

    type: "bar",

    barWidth: 10,

    barGap: 0,

    },

    {

    name: "成交量",

    type: "bar",

    barWidth: 10,

    },

    {

    name: "成交量",

    tooltip: {

    show: false,

    },

    type: "pictorialBar",

    symbol: "path://M 0,0 l 90,0 l -60,60 l -90,0 z",

    symbolSize: ["20", "7"],

    symbolOffset: ["-10", "-4"],

    symbolRotate: -16,

    symbolPosition: "end",

    z: 3,

    },

];

出现的问题:

鼠标悬浮在图表上,柱状图图表的左侧会出现与柱状图颜色一样的不规则的大矩形。

原因:

使用pictorialBar这种方式做的柱状图,y轴的值不能是0,否则就会出现上述的异常问题

解决方案:

  1. 后台数据改成,如果数据是0,则返回null

  2. 前端通过将数组转成字符串后,通过replace将null全部改为0.5

let newValue = JSON.stringify( value ).replace( /null/g ,0.5)

  1. 在tooltip中的formatter中,将0.5展示为0再 return 展示
tooltip:{ 
formatter:(parame)=>{ 
 if(parame.vaue==0.5) return 0
  return parame.value
  }
}

后台返回null而不是直接返回0.5是因为后台的变量类型是lang型,不能返回小数

前端将null转成0.5,又在tooltip中提示值为0的原因是:

  1. 如果值为0立体柱状图会出现显示异常的问题

  2. 这个柱状图统计的数据肯定是整数,不可能出现小数,所以用0.5来标志0

3.  如果不经过null-->0.5-->0这样的转换,后台返回null时,柱状图是不显示的,所以给了一个0.5这样一个小值,能够让其展示为0的效果

这样处理也有一个小问题,如果所有的返回数据都是0,这样最终就会显示成都是高0.55的柱状图,此时可以根据数据一般的y轴值,给定一个yAxis的max值,这个max值要跟0.5相差的比较多,或者将0.5再变小。这样就会解决掉上述的问题

2. echarts配置封装问题--互相影响

页面同时六个图表,需要将echarts配置封装一下,避免代码的冗余,这里了有个注意事项 封装的每一个特性,都应该作为一个方法的返回值,如下:

const grid = (top = 20, left = 50, bottom = 50, right = 20, color = "#fff") => {
  return {
    borderWidth: 0,
    top,
    left,
    right,
    bottom,
    textStyle: {
      color,
    },
  };
};

这样做的好处:

  1. 配置不是固定的,可以传值不同的参数
  2. echarts实例之间不会互相影响,如果只是定义一个配置对象导出, 在不同echarts实例中都使用这个配置对象,echarts初始化后的实例会显示异常: (其中就遇到了,a.悬浮到canvas上,echarts canvas背景色直接就变成了红色的,鼠标离开,红色背景色消失 b.不同的echarts折线图,后台返的数据也不同,但是最终图表显示相同的数据) 所以,封装的时候将配置都放在函数中进行返回,这样整洁安全可维护性也高

3. 组件v-show 导致canvas不能沾满父元素

当组件使用v-show进行控制时,内部的echarts实例渲染时,取不到正确的外层容器高宽,渲染异常。 代码中采用的是将v-show改成v-if,也可以放在this.$nextTick中,或者setTimeout,但是这种方式还没 有尝试

4. 数据过大与echarts游离dom造成内存越来越高的问题

echarts数据的堆叠方式:

说明:后台接口返回数据,前端接到数据后,携带者数据的最后一项的时间戳进行下一次请求,接到数据后,在之前返回的数据的基础上push新数据。 一个页面有6个图表,每个图表最终会有180个数据点

问题:浏览器内存持续升高

解决:

1.echarts实例不要放在data中,每个图表对应的数据也不要放在data中

因为vue会对遍历对象的每一层,6个eharts对象的嵌套层太多了,而且也没必要对echarts实例进行响应式监测,把实例对象放到data之外,减少内存消耗。数组数据也是这样,因为频繁的涉及到数据的push,而且数组的数据量比较较大,并且不需要响应式的渲染,因为每次都是通过api重新渲染图表,所以也把数组放到data外面

2.把echarts实例和数组对象放到data外面之后,发现内存还是一直在涨

原因:页面销毁后,在data外面定义的echarts实例对象与数组对象都没有被销毁, 导致游离dom持续增加,并且数组占用的浏览器内存也在持续升高。所以在组件destory的时候要将实例对象与数组都置位null

浏览器的内存升高主要是通过chorme浏览器的Memory面板中使用Heap snapshot这个内存快照功能, 生成了快照后,可以看到当前占用的内存总量大小,点击详情能够看到当前页面中Echarts实例的个数,如果随着页面的跳转,Echarts的实例越来越多,就是在页面离开前没有将Echarts实例置空,出现了游离dom