echarts 切换时出现上一次图形残留。

文章讲述了在Echarts5.3.2环境中,遇到悬浮高亮导致的问题,即使设置了notMerge:true,图表切换时旧图形仍不消失。解决方法包括在切换前取消高亮效果和禁用鼠标事件,或者配置Series为不可被悬浮。随着Echarts维护更新的减少,作者考虑转向G2可视化引擎。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说结果:悬浮高亮导致。这可能是echarts的bug。

一般情况下,出现这种问题,是setOption 中没有配置notMerge 导致新的配置与旧配置合并

但是我这里始终配置notMerge: true,仍然出现这种问题。

最后发现与鼠标悬浮有关。

环境

echarts@5.3.2

现象

触发步骤:

  1. 数据量较多时,能稳定复现。
  2. 鼠标悬浮到图表中,使折线图高亮。
  3. 此时通过echarts.setOption 重新绘制图表内容。且配置setOption 参数 notMerge: true。

初始化图表

悬浮的状态(导致折线图高亮),用同一个echarts实例setOption切换

切换后

可以看到原来的图形没有去除。

尝试网上解决方案

  • 切换前使用 echartsInstance.clear() 方法。无果。
  • clear之后,setTimeout 延迟setOption。 无果。

解决

取消 LineSeries的悬浮高亮效果。

方案1

切换前取消图表中的高亮效果。

echarts官方提供了这个接口。Documentation - Apache ECharts

echartsInstance.value?.dispatchAction({type: 'downplay'})

但是光这样还不行。因为取消后,立马动一下鼠标,则高亮效果又会上去。特别在异步的情况下。

因此还需要禁止鼠标事件,使其不能被hover。

这里通过css point-evnets: none 来实现。

也就是在切换前使其无法触发鼠标事件。切换后再回来即可。

方案2

配置series 使其不可被悬浮高亮。

lineseries.emphasis.disabled = true;

END

echarts怎么近期不维护了。

后面得转 G2 了 G2 可视化引擎 | AntV (gitee.io)

### Vue 中使用 ECharts 进行图表渲染的常见问题及解决方案 #### 数据残留问题 当在同一组件中切换多条记录ECharts 可能会显示之前数据残影。为了避免这种情况,在设置新的选项应清除旧数据。通过向 `setOption` 方法传递第二个参数 `true` 来实现这一点[^1]。 ```javascript // 正确做法:清除非当前数据显示 this.myChart.setOption(option, true); ``` #### 初次渲染尺寸过小 在 Vue3 中首次加载页面,如果立即尝试绘制 ECharts 图表,则可能会因为 DOM 尚未完全准备好而导致图表非常小。为了防止此情况发生,应当等待 DOM 完全加载后再执行绘图操作。可以利用 Vue 提供的 `nextTick()` 函数来确保这一过程[^2]。 ```javascript import { nextTick } from 'vue'; export default { methods: { initCharts() { // 初始化图表逻辑... }, async mounted() { await nextTick(); this.initCharts(); } } } ``` #### 动态更新数据 随着应用状态的变化而动态改变 ECharts 显示的内容是一个常见的需求。每当有新数据到来,应该先修改本地存储的数据副本,然后再调用 `setOption` 更新视图[^3]。 ```javascript var myChart = echarts.init(document.getElementById('myChart')); let data = [10, 20, 30, 40, 50]; function updateData(newValue) { data.push(newValue); myChart.setOption({ series: [{ data: data }] }); } updateData(60); // 添加一条新纪录并刷新图表 ``` #### 跨组件通信引起的渲染不稳定性 有会在父级组件触发某些事件后需要重新加载位于子组件内的 ECharts 实例。此需要注意的是要保证只有当所有必要的前置条件满足(比如 API 请求返回)才去触发表格重绘动作[^4]。 ```javascript // 父组件 <template> <ChildComponent ref="child"/> </template> <script setup> const child = ref(null); async function fetchDataAndRefreshChart(){ const response = await someApiCall(); child.value.refresh(response.data); } </script> // 子组件 (假设已经包含了基本的 ECharts 设置) methods:{ refresh(newData){ this.chartInstance.setOption({...newData}); } } ``` #### 自适应布局调整 对于那些可能经历窗口大小变化的应用来说,保持 ECharts 图形随容器自动缩放是很重要的。可以通过监听浏览器窗口大小变动事件,并适调用 `resize` 方法让图形自适应其所在区域[^5]。 ```javascript window.addEventListener('resize', () => { if(this.myChart){ this.myChart.resize(); } }); // 或者更推荐的方式是在特定场景下手动触发 resize, // 如导航栏折叠/展开、侧边栏宽度更改等情况。 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值