echarts学习:通过图例事件实现选中后控制多条折线的显隐

1.问题描述

我在工作中遇到了这样一个需求:我们都知道点击echarts折线图的图例,是可以控制折线的显隐的。我现在希望点击某一个图例可以改变多条折线的显隐。

例如在下面这张图中,我将"xxx水位"和"yyy水位"分为一组;将"xxx流量"和"yyy流量"分为一组。我希望当点击组内的任意一个图例时,可以改变整组折线的显隐。

2.问题分析

想要实现理想的效果,主要有两个要点:1.获取到图例点击事件;2.找到自定义折线显隐的方法。

(1)图例点击事件

echarts有完整的事件系统,在我们点击图例时legendselectchanged事件会被触发。

(2)控制折线的显隐

echarts还有一些控制图表的方法,称之为action图表行为。其中的legendToggleSelect方法就可以切换图例的选中状态,从而控制折线的显隐。

3.实现功能

我一开始的写法如下:

JavaScript 复制代码
const dimensionNames = [
  ["xxx水位", "yyy水位"],
  ["xxx流量", "yyy流量"],
];
onMounted(() => {
  nextTick(() => {
    const instance = chart.value.getInstance();
    instance.on("legendselectchanged", e => {
      /**
       * e = {
       *    name      //切换的图例名称
       *    selected  //所有图例的选中状态表
       * }
       */
      const name = dimensionNames
        .find(g => g.includes(e.name))
        .find(n => n !== e.name);

      instance.dispatchAction({
        type: "legendToggleSelect",
        name,
      });
    });
  });

但是这样写有一个问题:由于legendToggleSelect行为的会触发legendselectchanged事件,因此就会出现死循环。

为了解决这个问题就需要在代码中加入一个甄别机制,只在鼠标点击图例所触发的事件中使用legendToggleSelect行为。

JavaScript 复制代码
const dimensionNames = [
  ["xxx水位", "yyy水位"],
  ["xxx流量", "yyy流量"],
];
onMounted(() => {
  nextTick(() => {
    const instance = chart.value.getInstance();
    instance.on("legendselectchanged", e => {
      /**
       * e = {
       *    name      //切换的图例名称
       *    selected  //所有图例的选中状态表
       * }
       */
      const group = dimensionNames.find(g => g.includes(e.name));

      // 甄别是否是鼠标点击所触发的事件
      if (group.every(i => e.selected[i] == e.selected[e.name])) return;

      const name = group.find(n => n !== e.name);

      instance.dispatchAction({
        type: "legendToggleSelect",
        name,
      });
    });
  });

最终效果如下:

相关推荐
paopaokaka_luck2 天前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
腾讯数据架构师3 天前
任务跑完怎么直接出图表?CubeStudio 任务可视化 ECharts 数据格式实操(CSV/JSON + metric.json,11 种图表一键渲染)
前端·json·echarts·数据可视化
总要学点什么4 天前
第81篇:数据可视化-PM2.5分布——让圆点的胖瘦替每座城市报出浓度
前端·信息可视化·echarts·cesium·空间分析
paopaokaka_luck4 天前
社区服务平台(加权协同过滤推荐、Jieba中文词频分析、WebSocket实时聊天、求助处理闭环、 活动积分闭环、ECharts多维分析)
java·前端·spring boot·mysql·echarts·mybatis
mmsx4 天前
Android 并发考古:newThread 与 RxJava 共存,以及 GlobalScope 的三宗罪
android·echarts·rxjava
DataGear5 天前
DataGear 6.1.1 发布,数据可视化分析平台
javascript·信息可视化·数据分析·echarts·数据可视化
paopaokaka_luck6 天前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
半生过往6 天前
智慧园区数字孪生大屏总结
echarts·three.js
Highcharts.js7 天前
2026年,AI正在重写技术:“工具思维”正在失效?
人工智能·echarts·客户端·highcharts·可视化图表·企业级图表
paopaokaka_luck8 天前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节