首页 > 其他分享 >ehcarts 实战小计-1

ehcarts 实战小计-1

时间:2024-11-20 23:19:00浏览次数:1  
标签:实战 hover const name 展示 小计 ehcarts data baseData

需求

  • 展示未来未来36个月(等分为3个时间范围)的经济效益趋势,3个等分时间区域在趋势图上方常显,不同时间区域之间通过灰色虚线间隔开;
  • 鼠标hover趋势图每个1/3区域,对应区域会有以下3个效果:
    1. 时间范围卡片高亮;
    2. 趋势图上方展示对应指标;
    3. 趋势图展示阴影效果;
  • 鼠标hover or 点击趋势图无tooltips

实现方案

将整个需求拆分为三部分:

常态数据展示

数据来源中包含两组数据:baseDatadata,分别为图中底部的蓝线与顶部的灰线;阴影区域展示的为两部分的差值diffData

常态显示可通过baseDatadiffData设置相同值的stack,即可产生堆叠的效果:

查看代码
const diffData = baseData.map((_,index) => (data[index] - baseData[index]));
// echarts options
const options = {
    // other options
    // ...
      series: [
        {
          name: 'data',
          type: 'line',
          lineStyle: {
            width: 1.5,
            color: 'rgba(0, 0, 0, 0.1)'
          },
          showSymbol: false,
          data: data,
          markLine: {
            symbol: 'none',
            silent: true,
            lineStyle: {
              color: 'rgba(0, 0, 0, 0.1)',
              type: 'solid',
              width: 1
            },
            data: [
              {
                xAxis: xData[11],
                name: 'first period',
                label: {
                  show: false
                }
              },
              {
                xAxis: xData[23],
                name: 'second period',
                label: {
                  show: false
                }
              },
              {
                xAxis: xData[35],
                name: 'third period',
                label: {
                  show: false
                }
              }
            ]
          }
        },
        {
          name: 'baseData',
          type: 'line',
          stack: 'total',
          lineStyle: {
            width: 1.5,
            color: '#4476FF'
          },
          showSymbol: false,
          data: baseData
        }
      ]
};

等分时间区

等分时间去分为两部分:图中的灰线与顶部的时间区名称;

本方案中灰线采用markLine,而顶部的时间区有hover逻辑的展示,所以采用外层覆盖遮罩的方式实现:

hover逻辑

 hover时需要改变对应时间区内数据的areaStyle,并且展示由此计算的另一个数据 calculatedData,所以将这部分逻辑放在遮罩层中展示,根据hover拿到对应的时间区ID再执行相应的计算:

  1. 定义echarts实例的hover事件,获取对应的hoverIndex
  2. 根据hoverIndexdiffData截断为hoverDataunHoverData,并更新optionsseries
  3. 根据hoverIndex选取对应时间区的数据计算calculatedData
  4. 根据hoverIndex渲染时间区高亮和calculatedData展示

实现中遇到的问题

  1. 图像在hover时出现闪烁
  2. hover时机只在hover到数据点上才触发,需求需要在对应时间区

本文采用的是echarts-for-react组件库:

hover的逻辑初步通过定义ReactEcharts的onEvents属性定义

const onEvents = {
  'hoverover': handleHover,
}
...
<ReactECharts
  option={options}
  onEvents={onEvents}
/>

问题1原因:charts在组件内部重新渲染图表去绑定事件

解决方案:采用 onChartReady回调绑定事件

import React, { useEffect, useRef } from 'react';
import ReactECharts from 'echarts-for-react';

const MyChartComponent = () => {
  // 创建一个 ref 来引用 ECharts 实例
  const chartRef = useRef(null);

  // 使用 useEffect 来处理组件加载和卸载的逻辑
  useEffect(() => {
    // 定义一个回调函数,用于在图表准备好后执行
    const onChartReadyCallback = (chart) => {
      // 这里可以获取 ECharts 实例并进行操作
      // 例如,绑定 click 事件
      chart.on('click', (params) => {
        console.log('Chart clicked', params);
      });

      // 你还可以在这里执行其他操作,比如设置特定的配置项等
    };

    // 如果 chartRef 当前有当前的 ECharts 实例,就调用回调函数
    if (chartRef.current) {
      onChartReadyCallback(chartRef.current.getEchartsInstance());
    }

    // 组件卸载时,注销事件监听器
    return () => {
      const chart = chartRef.current.getEchartsInstance();
      if (chart) {
        chart.off('click');
      }
    };
  }, []);

  // 定义图表的配置项
  const getOption = () => {
    return {
      title: {
        text: 'ECharts Example'
      },
      tooltip: {},
      legend: {
        data:['Sales']
      },
      xAxis: {
        data: ["shirt", "cardigan", "chiffon shirt", "pants", "heels", "socks"]
      },
      yAxis: {},
      series: [{
        name: 'Sales',
        type: 'bar',
        data: [5, 20, 36, 10, 10, 20]
      }]
    };
  };

  return (
    <ReactECharts
      ref={chartRef}
      option={getOption()}
      style={{ height: 400 }}
      onChartReady={onChartReadyCallback}
    />
  );
};

export default MyChartComponent;

问题2:本文的数据量较少,考虑实现hover对应区域而不是数据点,采用tooltipformatter替代开始的hover逻辑

const options = {
    tooltip: {
        trigger: 'axis',
        transitionDuration: 0,
        formatter: renderToolTip,
    }
}

const renderToolTip = (params) => {
    const hoverdIndex = Math.floor(params[0]?.dataIndex / 12);
    // other hover operation...
}

 

标签:实战,hover,const,name,展示,小计,ehcarts,data,baseData
From: https://www.cnblogs.com/little-sheep10/p/18559539

相关文章

  • Java项目实战II基于微信小程序的课堂助手(开发文档+数据库+源码)
    目录一、前言二、技术介绍三、系统实现四、文档参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。一、前言在信息化教学日益普及的今天,如何更高效地辅助课堂学习,成为了教育技术......
  • Java项目实战II基于微信小程序的书橱系统(开发文档+数据库+源码)
    目录一、前言二、技术介绍三、系统实现四、文档参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言随着数字化时代的到来,阅读方式虽日趋多元......
  • Java项目实战II基于微信小程序的高校寻物平台(开发文档+数据库+源码)
    目录一、前言二、技术介绍三、系统实现四、文档参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言在快节奏的校园生活中,物品遗失与寻找成为......
  • Java项目实战II基于微信的设备故障报修管理系统(开发文档+数据库+源码)
    目录一、前言二、技术介绍三、系统实现四、文档参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言在现代企业管理中,设备故障报修的及时性和......
  • 嵌入式硬件实战基础篇(三)-四层板PCB设计-步进电机驱动(TMC2208/TMC2209)
    引言:我们在嵌入式硬件杂谈(三)中有提到阻抗匹配的问题,也引入了高速PCB设计的思想,并且此篇实战基础篇主要是基础的四层板的绘制设计,后续实战会对高速板展开,本篇主要是提升读者的设计PCB板的能力,以及对于嵌入式硬件设计能力的提升,对前面的理论作为实践性导向进行强化以及学习。本......
  • 鸿蒙实战开发—— IPC与RPC通信
    ......
  • HarmonyOS4+NEXT星河版入门与项目实战------Button组件
    文章目录1、控件图解2、案例实现1、代码实现2、代码解释3、运行效果4、总结1、控件图解这里我们用一张完整的图来汇整Button的用法格式、属性和事件,如下所示:按钮默认类型就是胶囊类型。2、案例实现这里我们实现一个根据放大和缩小按钮来改变图片大......
  • HarmonyOS4+NEXT星河版入门与项目实战-------- Text 组件与国际化实现
    文章目录1、Text控件图解2、国际化案例实现1、base文件夹下string.json配置2、en_US文件夹下string.json配置3、zh_CN文件夹下string.json配置4、小技巧:预览模式下语言切换5、页面代码3、运行效果4、总结1、Text控件图解使用$r这种本地......
  • 爬取网易云音乐热歌榜:从入门到实战
    爬取网易云音乐热歌榜:从入门到实战前提声明爬虫应遵守目标网站的robots.txt协议,尊重版权和用户隐私。本代码仅供学习和研究使用,不得用于商业用途。请确保在合法合规的前提下使用本代码。本代码所爬音乐为公开可选择的音乐目录引言环境准备代码结果代码解析1.榜单ID与......
  • 模板方法模式-java实战
    经典实现模板方法模式(TemplateMethodPattern)是一种行为型设计模式,它在父类中定义了一个算法的框架,允许子类在不改变算法结构的情况下重新定义算法的某些特定步骤。实现步骤:定义抽象类:这个类定义了算法的框架,包括模板方法和一些抽象方法。实现模板方法:模板方法定义了算......