当前位置: 首页 > news >正文

解决 ECharts 切换图表时的 Resize 问题

问题

场景:页面中需要切换展示多个图表——只有第一个切换的图表会自动应用 resize 方法,而后续切换的图表则无法正确响应尺寸变化,有时甚至连第一个图表都无法正常调整尺寸。

分析

ECharts 的 resize 方法是用于手动触发图表尺寸调整的。在正常情况下,当浏览器窗口大小发生变化时,ECharts 会自动调用 resize 方法来重新渲染图表。但在图表切换的场景下,由于 ECharts 实例的切换和 DOM 元素的动态变化,可能导致 resize 方法无法正确触发。此外,如果图表实例没有正确保存,或者在切换过程中没有及时调用 resize 方法,也会导致图表无法正确响应尺寸变化。

解决

全部代码可见博客echarts图表的轮播切换功能_echarts 轮播-CSDN博客

初始化图表实例

在初始化图表时,我们需要保存当前图表实例的引用,以便在需要时调用其 resize 方法。

let currentChartInstance: ECharts | null = null;
const myChart = initEcharts(ref, annularList, gradientColors, gradientColors, title);
currentChartInstance = myChart; // 保存当前图表实例

当组件销毁或不再需要图表时,可以通过 dispose 方法销毁图表实例,释放资源,避免内存泄漏。例如:

if (currentChartInstance) {
  currentChartInstance.dispose();
  currentChartInstance = null; // 清空引用
}

如果图表需要根据数据的变化动态更新,可以通过保存的实例快速响应。例如,在 Vue 的生命周期中,可以在 onMounted 初始化图表,在 onUnmounted 销毁图表:

import { onMounted, onUnmounted } from 'vue';

onMounted(() => {
  const myChart = initEcharts(containerRef, data, colors, title);
  currentChartInstance = myChart;
});

onUnmounted(() => {
  if (currentChartInstance) {
    currentChartInstance.dispose();
    currentChartInstance = null;
  }
});

 

自定义 Resize 函数

定义 resizeChart 函数,通过 setTimeout 延迟调用当前图表实例的 resize 方法。这样可以确保在 DOM 元素完成更新后,图表能够正确获取到新的尺寸并重新渲染。

let timer: ReturnType<typeof setTimeout> | undefined = undefined;
let currentChartInstance: ECharts | null = null;

const resizeChart = (): void => {
  // 清除之前的定时器,避免重复触发
  if (timer) {
    clearTimeout(timer);
  }
  timer = setTimeout(() => {
    if (currentChartInstance) {
      currentChartInstance.resize(); // 调用当前图表实例的 resize 方法
    }
  }, 500);
};

监听窗口大小变化

为了确保图表在窗口大小发生变化时能够正确调整尺寸,我们需要在组件挂载时监听 resize 事件,并在组件卸载时移除监听器。

import { onMounted, onBeforeUnmount } from 'vue';

onMounted(() => {
  window.addEventListener('resize', resizeChart);
});

onBeforeUnmount(() => {
  window.removeEventListener('resize', resizeChart);
  clearTimeout(timer); // 清除定时器
});

总结

成功解决了 ECharts 在切换图表时无法正确触发 resize 方法的问题。自定义的 resizeChart 函数通过延迟调用 resize 方法,确保了图表能够在 DOM 元素更新完成后正确获取新的尺寸并重新渲染。同时,通过监听窗口大小变化事件,图表在浏览器窗口调整时也能正确响应尺寸变化。

相关文章:

  • STL---set常用函数
  • c语言笔记 结构体基础
  • QT QML实现音频波形图进度条,可点击定位或拖动进度
  • 单目3d detection算法记录
  • 24集《不负美食不负卿》联合出品制作签约仪式成功举行
  • 【运维自动化-标准运维】如何实现一个最简单的流程编排
  • 【Redis】Redis的数据删除(过期)策略,数据淘汰策略。
  • [Nowruz 1404] 2025 Crypto/PWN部分
  • 三月九次前端面试复盘:当场景题成为通关密钥
  • 使用 EchoAPI 实现 API 断言的全面指南
  • vulhub/Billu_b0x靶机----练习攻略
  • c盘清理宝藏小工具
  • 使用Trainer传入自定义的compute_metrics函数时,oom报错
  • Diffusion Transformers (DiTs) - 用Transformer革新Diffusion模型
  • 构建高可靠NFS存储:自动化挂载保障机制的设计与优势
  • 【Vuex:在带命名空间的模块内访问全局内容】
  • Docker运行postgreSQL,由于异常启动或者退出后,提示could not locate a valid checkpoint record
  • JS—事件委托:3分钟掌握事件委托
  • vlan初学的总结
  • NLP高频面试题(四)——BN和LN的区别与联系,为什么attention要用LN
  • 铁肩担道义,历史鉴未来——中共中央政治局委员、外交部长王毅谈习近平主席对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典
  • 巴基斯坦外长:近期军事回应是自卫措施
  • 数理+AI+工程,上海交大将开首届“笛卡尔班”招生约20名
  • 红场阅兵即将开始!中国人民解放军仪仗队亮相
  • 绿城房地产集团:近半年累计花费20.6亿元购买旗下债券
  • 上海加力提速推进优化营商环境,明确“十大攻坚突破任务”