Echarts填坑记录

作者: 穆熙沐 | 来源:发表于2020-03-19 15:49 被阅读0次

最近项目有个月报分析,里边用到了柱状图,堆叠图,环形图,饼图,折线图这几种基本图表。
自己封装的chart组件:

<!-- 图表组件-->
<template>
    <div :id="echartId" :class="className">
    </div>
</template>
<script>
import * as echarts from 'echarts/dist/echarts.min';
export default {
    name: 'Chart',
    props: {
        echartId: {
            type: String,
            default: ''
        },
        className: {
            type: String,
            default: ''
        },
        option: {
            type: Object,
            default() {
                return {};
            }
        }
    },
    watch: {
        option: {
            handler(val) {
                this.initEcharts();
            },
            deep: true
        }
    },
    mounted() {
        this.initEcharts();
    },
    methods: {
        initEcharts() {
            const chartObj = echarts.init(document.getElementById(this.echartId));
            // 响应式
            window.onresize = function () {
                chartObj.resize();
            };
            chartObj.setOption(this.option);
            //环形图点击内环,外环数据联动 
            if (this.echartId === 'cost-spread') {
                chartObj.off('click');
                chartObj.on('click', (params) => {
                    this.$emit('updateIndex', params);
                    this.initEcharts();
                });
           }
        }
    }
};
</script>

问题
1)图表第一次渲染是没问题的。当切换筛选条件第二次渲染的时候,会把第一次的数据合并。
解决办法:应该设置mychart.setoption({},true);
原因:chart.setOption(option,notMerge,lazyUpdate);
option:图表的配置项和数据
notMerge:可选,是否不跟之前设置的option进行合并,默认为false,即合并。(这里是导致二次渲染不成功的根本)
lazyUpdate:可选,在设置完option后是否不立即更新图表,默认为false,即立即更新。
2)一个cavans里有多个图表,比如环形图和柱状堆叠图。
tooltip对于柱状堆叠图和环形图的用法不一样。所以要在柱状堆叠图的grid里再设置一遍。
并且实现堆叠图hover当前鼠标所在位置数值。

tooltip: {
                    trigger: 'item' (饼图)/'axis'(grid坐标轴),
                    axisPointer: {
                        type: "cross",
                        label: {
                            show: false,
                            formatter: function (params) {
                                if (params.seriesData.length === 0) {
                                    // 鼠标对应的y轴数据
                                    window.mouseCurValue = params.value;
                                }
                            }
                        }
                    },
                    formatter: function (params) {
                      //堆叠图
                        if (Array.isArray(params)) {
                            let res = "", sum = 0, sub = 0, arr = [], brr = [];
                            params.forEach(i => {
                                if (i.data > 0) {
                                    arr.push(i);
                                } else {
                                    brr.push(i);
                                }
                            });
                            if(window.mouseCurValue > 0) {
                                for (let i = 0; i < arr.length; i++) {
                                    let series = arr[i];
                                    series.seriesName = series.seriesName.indexOf('other') > -1 ? 'others' : series.seriesName;
                                    sum += Number(series.data);
                                    if (sum >= window.mouseCurValue) {
                                        res = series.axisValue + "<br/>" + series.marker + series.seriesName + ": " + format.commafy(series.data) + "<br/>";
                                        break;
                                    }
                                }
                            } else {
                                for (let i = 0; i < brr.length; i++) {
                                    let series = brr[i];
                                    series.seriesName = series.seriesName.indexOf('other') > -1 ? 'others' : series.seriesName;
                                    sub += Number(series.data);
                                    if (sub <= window.mouseCurValue) {
                                        res = series.axisValue + "<br/>" + series.marker + series.seriesName + ": " + format.commafy(series.data) + "<br/>";
                                        break;
                                    }
                                }
                            }
                            return res;
                        } else {
                            let name = params.name.indexOf('other') > -1 ? 'others' : params.name;
                            return  name + ": " + utils.millionMoney(params.value);
                        }
                    }
                }

3)label 字体样式是否折行,折行样式

label: {
                        normal: {
                            formatter: function (p) {
                                let str = '{a|' + p.data.costName + '}{abg|}\n{hr|}\n{c|'+ p.name + ':' + p.value  + ' }{per|' +  p.percent + '%}';
                                return str;
                            },
                            rich: {
                                a: {
                                    fontSize: 10,
                                    lineHeight: 17,
                                    color: '#999',
                                    align: 'center'
                                },
                                hr: {
                                    width: '100%',
                                    height: 0
                                },
                                c: {
                                    fontSize: 10,
                                    lineHeight: 17,
                                    color: '#333',
                                    align: 'left'
                                },
                                per: {
                                    fontSize: 10,
                                    borderRadius: 2,
                                    color: 'white',
                                    align: 'left',
                                    padding: [1, 4, 2, 4],
                                    backgroundColor: '#727272',
                                    borderRadius: 2
                                }
                            }
                        }
                    },

相关文章

  • Echarts填坑记录

    最近项目有个月报分析,里边用到了柱状图,堆叠图,环形图,饼图,折线图这几种基本图表。自己封装的chart组件: 问...

  • 2018-09-06--ActiveAndroid在8.0权限问

    ActiveAndroid填坑记录: 坑--------》使用ActiveAndroid数据库在系统8.0(华为、...

  • swift填坑记录

    使用Cocoapods时,Swift无法同时在podfile文件中使用OC和Swift的SDK 【引用】https...

  • swagger 填坑记录

    启动失败:NullPointerException 原因主要是swagger旧版本的bug与,解决方案:swagg...

  • Android填坑记录

    主要记录Android开发当中一些容易引起错误的,又不容易发现的问题。 Activity方面 1,onWindow...

  • Android 填坑记录

    1.使用Fresco时,根据图片url获取缓存文件 2.使用Fresco时,如何实现缩放效果(PhotoView)...

  • Vue填坑记录

    记录使用Vue 2.6.11过程中遇到的一些问题及其解决办法 vue和vue-template-compile的版...

  • ObjectBox填坑记录

    一、找不到MyObjectBox类 1.初次引入ObjectBox的时候,在使用MyObjectBox类之前,需要...

  • MPAndroidChart 填坑记录

    1. x轴部分展示,可滑动 2. 在1的基础上,每次加载新数据自动滚动到最后 另外有个bug,如果开启了线性滚动 ...

  • 后端填坑记录

    前言 因为需要搞定项目中大大小小所有坑,所以总是有些东西需要记录下来方便备查。另外就是原先没有记录下来的点,搞清楚...

网友评论

    本文标题:Echarts填坑记录

    本文链接:https://www.haomeiwen.com/subject/jwpgehtx.html