VUE中ECharts提示框tooltip自动切换

news2024/12/26 12:07:40

目录

  • 前言
    • 1导入插件
    • 2定义参数
    • 3 插件API

前言

使用VUE开发的数据大屏统计,又需要将 echarts的提示框 tooltip 实现自动切换,网上有个很简单的插件(echarts-tooltip-auto-show),使用教程简单分享给大家。
自动每隔几秒切换tooltip,鼠标移入则停止并展示当前鼠标所指向的提示框。
效果如下图所示:
在这里插入图片描述

1导入插件

首先,下载插件中的 echarts-tooltip-carousel.js 文件引入VUE项目中(插件在文章结尾,路径自行更换)


import { loopShowTooltip } from '@/assets/resource/echarts-tooltip-carousel';

2定义参数

接着自定义一个参数,用来清除定时器,并写入调用方法(下图中,可清晰看出代码位置)


var tootipTimer = null; // 自定义参数 用来清除定时器
// 可调用clearLoop方法,清除定时器
tootipTimer && tootipTimer.clearLoop();
tootipTimer = null;
// 调用切换方法
tootipTimer = tools.loopShowTooltip(myChart, option, {
  interval: 2000, // 切换间隔时间
  loopSeries: true // 循环切换是否启用
});

在这里插入图片描述
插件git:

https://gitee.com/bubunuo/echarts-tooltip-auto-show

3 插件API

function loopShowTooltip (chart, chartOption, options);

参数说明
chartECharts实例
chartOptionECharts配置信息
options{interval:轮播时间间隔,单位毫秒,默认为2000;loopSeries: boolean类型,默认为false。true表示循环所有series的tooltip;false则显示指定seriesIndex的tooltip。seriesIndex: 默认为0,指定某个系列(option中的series索引)循环显示tooltip,当loopSeries为true时,从seriesIndex系列开始执行。}
返回值{clearLoop: clearLoop} 取消轮播

如若插件无法访问,可自行拷贝下方完整插件代码 echarts-tooltip-carousel.js
自己拷贝,新建JS文件,引入使用即可。

(function (global) {
  global.tools = global.tools || {};

  /**
   * echarts tooltip轮播
   * @param chart ECharts实例
   * @param chartOption echarts的配置信息
   * @param options object 选项
   * {
   *  interval    轮播时间间隔,单位毫秒,默认为2000
   *  loopSeries  boolean类型,默认为false。
   *              true表示循环所有series的tooltip,false则显示指定seriesIndex的tooltip
   *  seriesIndex 默认为0,指定某个系列(option中的series索引)循环显示tooltip,
   *              当loopSeries为true时,从seriesIndex系列开始执行。
   *  updateData  自定义更新数据的函数,默认为null;
   *              用于类似于分页的效果,比如总数据有20条,chart一次只显示5条,全部数据可以分4次显示。
   * }
   * @returns {{clearLoop: clearLoop}}
   */
  tools.loopShowTooltip = function (chart, chartOption, options) {
    let defaultOptions = {
      interval: 2000,
      loopSeries: false,
      seriesIndex: 0,
      updateData: null
    };

    if (!chart || !chartOption) {
      return;
    }

    let dataIndex = 0; // 数据索引,初始化为-1,是为了判断是否是第一次执行
    let seriesIndex = 0; // 系列索引
    let timeTicket = 0;
    let seriesLen = chartOption.series.length; // 系列个数
    let dataLen = 0; // 某个系列数据个数
    let chartType; // 系列类型
    let first = true;
    let lastShowSeriesIndex = 0;
    let lastShowDataIndex = 0;
    if (seriesLen === 0) {
      return;
    }

    //待处理列表
    //不循环series时seriesIndex指定显示tooltip的系列,不指定默认为0,指定多个则默认为第一个
    //循环series时seriesIndex指定循环的series,不指定则从0开始循环所有series,指定单个则相当于不循环,指定多个
    //要不要添加开始series索引和开始的data索引?

    if (options) {
      options.interval = options.interval || defaultOptions.interval;
      options.loopSeries = options.loopSeries || defaultOptions.loopSeries;
      options.seriesIndex = options.seriesIndex || defaultOptions.seriesIndex;
      options.updateData = options.updateData || defaultOptions.updateData;
    } else {
      options = defaultOptions;
    }

    //如果设置的seriesIndex无效,则默认为0
    if (options.seriesIndex < 0 || options.seriesIndex >= seriesLen) {
      seriesIndex = 0;
    } else {
      seriesIndex = options.seriesIndex;
    }

    /**
     * 清除定时器
     */
    function clearLoop() {
      if (timeTicket) {
        clearInterval(timeTicket);
        timeTicket = 0;
      }
      chart.off('mousemove', stopAutoShow);
      zRender.off('mousemove', zRenderMouseMove);
      zRender.off('globalout', zRenderGlobalOut);
    }

    /**
     * 取消高亮
     */
    function cancelHighlight() {
      /**
       * 如果dataIndex为0表示上次系列完成显示,如果是循环系列,且系列索引为0则上次是seriesLen-1,否则为seriesIndex-1;
       * 如果不是循环系列,则就是当前系列;
       * 如果dataIndex>0则就是当前系列。
       */
      let tempSeriesIndex = dataIndex === 0 ?
        (options.loopSeries ?
          (seriesIndex === 0 ? seriesLen - 1 : seriesIndex - 1)
          : seriesIndex)
        : seriesIndex;
      let tempType = chartOption.series[tempSeriesIndex].type;

      if (tempType === 'pie' || tempType === 'radar') {
        chart.dispatchAction({
          type: 'downplay',
          seriesIndex: lastShowSeriesIndex,
          dataIndex: lastShowDataIndex
        });//wait 系列序号为0且循环系列,则要判断上次的系列类型是否是pie、radar
      }
    }

    /**
     * 自动轮播tooltip
     */
    function autoShowTip() {
      let invalidSeries = 0;
      let invalidData = 0;

      function showTip() {
        //判断是否更新数据
        if (dataIndex === 0 && !first && typeof options.updateData === "function") {
          options.updateData();
          chart.setOption(chartOption);
        }

        let series = chartOption.series;
        let currSeries = series[seriesIndex];
        if (!series || series.length === 0 ||
          !currSeries || !currSeries.type || !currSeries.data ||
          !currSeries.data.length) {
          return;
        }
        chartType = currSeries.type; // 系列类型
        dataLen = currSeries.data.length; // 某个系列的数据个数

        let tipParams = {seriesIndex: seriesIndex};
        switch (chartType) {
          case 'pie':
          case 'map':
          case 'chord':
            tipParams.name = currSeries.data[dataIndex].name;
            break;
          case 'radar': // 雷达图
            tipParams.seriesIndex = seriesIndex;
            tipParams.dataIndex = dataIndex;
            break;
          default:
            tipParams.dataIndex = dataIndex;
            break;
        }

        if (chartType === 'pie' || chartType === 'radar') {
          if (!first) {
            cancelHighlight();
          }

          // 高亮当前图形
          chart.dispatchAction({
            type: 'highlight',
            seriesIndex: seriesIndex,
            dataIndex: dataIndex
          });
        }

        // 显示 tooltip
        tipParams.type = 'showTip';

        // 防止updateData时先处理tooltip后刷新数据导出tooltip显示不正确
        setTimeout(() => {
          chart.dispatchAction(tipParams);
        }, 0);

        lastShowSeriesIndex = seriesIndex;
        lastShowDataIndex = dataIndex;
        dataIndex = (dataIndex + 1) % dataLen;
        if (options.loopSeries && dataIndex === 0) { // 数据索引归0表示当前系列数据已经循环完
          invalidData = 0;
          seriesIndex = (seriesIndex + 1) % seriesLen;
          if (seriesIndex === options.seriesIndex) {
            invalidSeries = 0;
          }
        }

        first = false;
      }

      showTip();
      timeTicket = setInterval(showTip, options.interval);
    }

    // 关闭轮播
    function stopAutoShow() {
      if (timeTicket) {
        clearInterval(timeTicket);
        timeTicket = 0;

        if (chartType === 'pie' || chartType === 'radar') {
          cancelHighlight();
        }
      }
    }

    let zRender = chart.getZr();

    function zRenderMouseMove(param) {
      if (param.event) {
        //阻止canvas上的鼠标移动事件冒泡
        param.event.cancelBubble = true;
      }

      stopAutoShow();
    }

    // 离开echarts图时恢复自动轮播
    function zRenderGlobalOut() {
      if (!timeTicket) {
        autoShowTip();
      }
    }

    // 鼠标在echarts图上时停止轮播
    chart.on('mousemove', stopAutoShow);
    zRender.on('mousemove', zRenderMouseMove);
    zRender.on('globalout', zRenderGlobalOut);

    autoShowTip();

    return {
      clearLoop: clearLoop
    };
  };
})(window);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1912853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024前端面试真题【JS篇】

DOM DOM&#xff1a;文本对象模型&#xff0c;是HTML和XML文档的编程接口。提供了对文档的结构化的表述&#xff0c;并定义可一种方式可以使从程序中对该结构进行访问&#xff0c;从而改变文档的结构、样式和内容。 DOM操作 创建节点&#xff1a;document.createElement()、do…

数据结构(初阶2.顺序表)

文章目录 一、线性表 二、顺序表 2.1 概念和结构 2.2 分类 2.2.1 静态顺序表 2.2.2 动态顺序表 2.3动态顺序表的实现 1.SeqList.h 2.SeqList.c 打印顺序表 初始化 销毁 增容 尾插 头插 在指定位置之前插入数据 尾删 头删 在指定位置删除数据 3.test.c 一、线性表 线性表&#…

Ubuntu 24.04 LTS (Linux) 安装二维码生成工具 QRencode 二维码生成和识别

1 Ubuntu 安装 sudo apt update sudo apt-get install qrencode 2 查看版本 qrencode -V 3 生成二维码 qrencode -o test.png http://www.baidu.com 可以下载test.png图片,用手机浏览器扫描下看(⊙﹏⊙)

单对以太网:工业4.0时代的通信革命

单对以太网连接器概述 单对以太网&#xff08;Single Pair Ethernet&#xff0c;简称SPE&#xff09;是一种新兴的以太网技术&#xff0c;它通过一对双绞线实现数据传输&#xff0c;支持PoDL&#xff08;Power over Data Line&#xff09;技术&#xff0c;为终端设备提供电力供…

SSE 和 WebSocket 的区别与选择指南

在构建现代网络应用时&#xff0c;实时通信技术扮演着至关重要的角色。本文将深入讨论 Server-Sent Events (SSE) 和 WebSocket ——两种主要的实时通信技术&#xff0c;对比它们的实现方式、优势和具体用途&#xff0c;以帮助开发人员根据自身项目需求选择合适的技术。 何为 …

绝区捌--将GPT幻觉的发生率从20%以上降低到2%以下

总结&#xff1a;我们没有使用微调&#xff0c;而是结合使用提示链和预处理/后处理来将幻觉发生率降低一个数量级&#xff0c;但这确实需要对 OpenAI 进行 3-4 倍的调用。还有很大的改进空间&#xff01; 使用 GPT 等大型语言模型面临的最大挑战之一是它们倾向于捏造信息。 这…

328. 奇偶链表

https://leetcode.cn/problems/odd-even-linked-list/https://leetcode.cn/problems/odd-even-linked-list/ 解题思路&#xff1a; 把第一个和第二个节点分别作为奇数、偶数的头节点&#xff0c;当遇到奇节点&#xff0c;删除&#xff0c;并插入到奇数头节点后&#xff0c;这样…

【深度学习基础】环境搭建 Linux报错bash: conda: command not found...

目录 一、 问题描述二、 解决方法1. 在.bashrc文件中添加环境变量2. 卸载重装anconda 三、总结 一、 问题描述 在linux环境下安装anaconda时候报错&#xff1a;bash: conda: command not found… 二、 解决方法 1. 在.bashrc文件中添加环境变量 参考链接&#xff1a;【解决】…

HTML语言常见标签

语法 HEAD部分的HTML标签 1 标题标签 <title>标题内容</title> 2 段落标签 <meta charset"utf-8"/> BODY部分的HTML标签 1标题标签&#xff08;独占一行&#xff09;<h1>标题内容</h1> 2段落标签&#xff08;独占一行&#xff09;…

AI论文作图——如何表示模型参数冻结状态

一、LOGO &#x1f525; win10win11 ❄️ win10win11 二、注意事项&#xff1a; 根据电脑系统&#xff0c;选择对应的版本。 参考&#xff1a; 【AI论文作图】如何表示模型参数冻结状态&#xff1f;

51单片机-第二节-数码管

一、数码管介绍&#xff1a; 1.什么是数码管&#xff1f; 多个LED组合成8字显示器。 2.一位数码管的引脚&#xff08;只有一个8&#xff09;&#xff1a; 数码管的引脚为1-10&#xff0c;其中公共极为3,8&#xff0c;其余八位分别对应一个二极管&#xff0c;如下图&#xff…

第一个基于FISCOBCOS的前后端项目(发行转账)

本文旨在介绍一个简单的基于fiscobcos的前后端网站应用。Springbootjs前后端不分离。 所使用到的合约也是一个最基本的。首先您需要知道的是完整项目分为三部分&#xff0c;1是区块链平台webase搭建&#xff08;此项目使用节点前置webase-front即可&#xff09;&#xff0c;2是…

论文阅读2-《Dynamic Multimodal Fusion》

摘要 &#xff08;DynMM&#xff09;&#xff0c;一种新的方法&#xff0c;自适应融合多模态数据和 d在推理过程中生成依赖于数据的前向路径。为此&#xff0c;我们提出了一种门控功能来提供基于多模态特征和一个的模态级或融合级决策提高计算效率的源感知损失函数。 细节 模…

Java技术栈总结:JVM虚拟机篇

一、Java的四种引用类型 1、强引用 最常见的引用&#xff0c;类似Object obj new Object()、String str “hello”。如果一个对象具有强引用&#xff0c;垃圾回收器绝对不会回收它。即使抛出“OutOfMemoryError”错误&#xff0c;程序终止&#xff0c;也不会随意回收具有强引…

【鸿蒙学习笔记】使用动画

官方文档&#xff1a;使用动画 目录标题 属性动画&#xff1a;通用属性发生改变时而产生的属性渐变效果animationanimateTo自定义属性动画 AnimatableExtend 转场动画&#xff1a;是页面或组件的切换动画 , 显示/隐藏 切换时的动画出现/消失转场&#xff1a;实现一个组件出现或…

数据可视化之智慧农业的窗口与引擎

在科技日新月异的今天,农业作为国民经济的基础产业,正逐步向智能化、数字化转型。农业为主题的数据可视化大屏看板,作为这一转型过程中的重要工具,不仅为农业管理者提供了全面、实时的农田信息,还促进了农业资源的优化配置和农业生产效率的提升。本文将深入探讨农业数据可…

Linux_网络编程_TCP

服务器客户端模型&#xff1a; client / server brow / ser b / s http p2p socket——tcp 1、模式 C/S 模式 》服务器/客户端模型 server :socket()-->bind()--->listen()-->accept()-->recv()-->close()client :socket()-->conn…

Mock 测试技术

一、Mock 类框架的使用场景 在实际软件开发中&#xff0c;要进行测试的方法存在外部依赖&#xff08;如 db&#xff0c;redis&#xff0c;第三方接口调用等&#xff09;&#xff0c;这些外部依赖可能存在各种问题&#xff0c;例如不稳定、缺乏数据、难以模拟等等&#xff0c;所…

Python29 Tensorflow的基本知识和使用

1. TensorFlow TensorFlow 是一个开源的机器学习框架&#xff0c;由 Google Brain 团队开发。它用于数据流图的计算&#xff0c;尤其擅长深度学习任务。在 TensorFlow 中&#xff0c;数据流图&#xff08;Data Flow Graph&#xff09;是其核心概念之一&#xff0c;它定义了计算…

(图文详解)小程序AppID申请以及在Hbuilderx中运行

今天小编给大家带来了如何去申请APPID&#xff0c;如果你是小程序的开发者&#xff0c;就必须要这个id。 申请步骤 到小程序注册页面&#xff0c;注册一个小程序账号 微信公众平台 填完信息后提交注册 会在邮箱收到 链接激活账号 确认。邮箱打开链接后&#xff0c;会输入实…