美文网首页
echarts.js[series-custom]自定义系列二

echarts.js[series-custom]自定义系列二

作者: scrollHeart | 来源:发表于2023-08-17 23:15 被阅读0次

    legendselectchanged:切换图例选中状态后的事件

    this.chartRef.on('legendselectchanged', (e) => {
    console.log(e) 
    // {
       // name:  '图例名称',
       // selected: {'图例名称1': true/false, '图例名称2': true/false},  所有图例的选中态(true/false)
       // type: "legendselectchanged"  事件类型
    // }
    })
    

    通常业务中会判断当前图例的选中状态,eg:

    if (!e.selected[e.name]) {
    // 点击项是取消选中状态
    }
    else {
    // 点击项是选中状态
    }
    

    基于echarts.js [series-custom]自定义系列中的图形元素渲染做业务扩展
    1.渲染多个图例
    2.同时段上多个图例项均有数据时,采用上下方式渲染柱形图,目前支持2个并行
    3.切换图例选中态,并行时段的图形展示需要变化(并行图例开关开启时,以虚线分隔上下方式渲染图形,关闭时,只居中显示一个图例对应的图形数据)

    分析需求难点:
    1.当前图例项和其他图例项在某个时段均有数据时,此时段的当前图例数据重新渲染
    2.受当前图例项影响的,此时段的其他图例项数据部分重新渲染

    <template>
        <div ref="chart"></div>
    </template>
    
    this.chartRef = echarts.init(this.$refs.chart);
    // 注册legendselectchanged事件
                this.chartRef.on('legendselectchanged', (e) => {
                    console.log(e, 'legendselectchanged');
                    // 点击的图例中,不重复部分数据的索引
                    let setIndex = 0;
                    // 点击的图例中,重复部分数据的索引(1个或多个,取决于重复的图例有几个)
                    let curdubbleIndexArr = [];
                    // 关联的其他图例,重复部分数据的map值(1个或多个,取决于重复的图例有几个)
                    let aboutMapArr = [];
                    let aboutIndexArr = [];
                    let eKey = '';
                    this.dubbleIndexArr.forEach(i => {
                        if (this.chartOptions[i].name === e.name) {
                            curdubbleIndexArr.push(i);
                        }
                    })
                    this.setIndexArr.forEach(i => {
                        if (this.chartOptions[i].name === e.name) {
                            setIndex = i;
                        }
                    })
                    // 不管是取消选中,还是选中,我们都要考虑到n种情况,比如
                    // 1.当前图例项和其他图例项在某个时段均有数据时,此时段的当前图例数据重新渲染
                    // 2.受当前图例项影响的,此时段的其他图例项数据部分重新渲染
                    for(let key in this.mapObj) {
                        if (this.mapObj[key] === e.name) {
                            eKey = key;
                            this.optionColorArr.forEach(item => {
                                if (item.includes('/') && item.split('/').includes(key)) {
                                    item.split('/').forEach(i => {
                                        if (i !== key) {
                                            aboutMapArr.push(i);
                                        }
                                    })
                                }
                            })
                        }
                    }
    
                    this.optionColorArr.forEach(item => {
    
                        if (item.includes('/') && item.split('/').includes(e.name)) {
                            item.split('/').forEach(i => {
                                if (i !== e.name) {
                                    aboutMapArr.push(i);
                                }
                            })
                        }
                    })
                    let ttIndexArr = [];
                    for (let j = 0; j < aboutMapArr.length; j++) {
                        let ind = (this.optionColorArr).indexOf(`${aboutMapArr[j]}/${eKey}`);
                        let ind2 = (this.optionColorArr).indexOf(`${eKey}/${aboutMapArr[j]}`);
                        if (ind > -1) {
                            ttIndexArr.push(ind);
                        }
                        else if (ind2 > -1) {
                            ttIndexArr.push(ind2);
                        }
                    }
    
                    for (let j = 0; j < ttIndexArr.length; j++) {
                        let num = ttIndexArr[j];
                        let ind = 0;
                        for (let k = 0; k < num; k++) {
                            if (this.optionColorArr[k].includes('/')) {
                                ind = ind + 2;
                            }
                            else {
                                ind++;
                            }
                        }
                        this.optionColorArr[num].split('/').forEach((i,index) => {
                            if (i !== eKey) {
                                ind = ind + index;
                            }
                        })
                        aboutIndexArr.push(ind);
                    }
    
                    // 点击项是取消选中状态
                    if (!e.selected[e.name]) {
                        for (let k = 0; k < aboutIndexArr.length; k++) {
                            let aboutInd = aboutIndexArr[k];
                            this.posiYObj[aboutInd] = - height/2;
                        }
    
                        // 先判断下,当前图例项是否有某时段并行的其他图例项,
                        // 如果有,那么就要把当前图例项此时段的所有数据都置为0
                        if (curdubbleIndexArr.length > 0) {
                            curdubbleIndexArr.forEach(i => {
                                this.series[i].data = [];
                            })
                        }
                        // 如果没有,那么就只把当前图例项的数据置为0
                        this.series[setIndex].data = [];
                    }
                    else {
                        // 点击项是选中状态
                        for (let k = 0; k < aboutIndexArr.length; k++) {
                            let aboutInd = aboutIndexArr[k];
                            this.posiYObj[aboutInd] = this.oldPosiYObj[aboutInd];
                        }
                        this.series[setIndex].data = this.parsedChartData[setIndex];
                        for (let i = 0; i < curdubbleIndexArr.length; i++) {
                            let dubbleIndex = curdubbleIndexArr[i];
                            this.series[dubbleIndex].data = this.parsedChartData[dubbleIndex];
                            this.posiYObj[dubbleIndex] = this.oldPosiYObj[dubbleIndex];
                        }
                    }
                    this.chartRef.clear();
                    this.chartRef.setOption(option);
                    this.chartRef.setOption({
                        legend: {
                            selected: {[e.name]: e.selected[e.name]},
                        }
                    })
                });
    

    效果图:
    (目前插入图片无法显示)
    源码可见:https://github.com/scrollHeart/echartsDemo

    相关文章

      网友评论

          本文标题:echarts.js[series-custom]自定义系列二

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