Version
6.0.0 (bug present since at least 4.1.0)
Link to Minimal Reproduction
N/A — occurs in any framework (React, Vue, Angular) where chart components unmount during user interaction.
Steps to Reproduce
- Render any chart (sankey, treemap, pie, line) with mouse event handlers
- Navigate away (unmount the component) or call
setOption with replacement data while the mouse cursor is over the chart
- A stale
mousemove/mouseout event fires after dispose() clears the series data
Current Behavior
TypeError crashes:
Cannot read properties of undefined (reading 'getRawIndex') — from DataFormatMixin.getDataParams() base method
Cannot read properties of undefined (reading 'tree') — from TreemapSeriesModel.getDataParams() override
- Similar crashes possible in pie (
.each), funnel (.mapDimension), sunburst/tree (.tree), chord (.getName)
Stack trace (Sankey example):
DataFormatMixin.getDataParams (dataFormat.ts)
SankeySeriesModel.getDataParams (SankeySeries.ts)
<anonymous> (echarts.ts:778) — findEventDispatcher callback
ECharts.handler → Handler.mousemove → HandlerDomProxy.mousemove
Stack trace (Treemap example):
TreemapSeriesModel.getDataParams (TreemapSeries.ts:126)
<anonymous> (echarts.ts:778)
findEventDispatcher → ECharts.handler → Handler.mousemove
Expected Behavior
Mouse events on disposed chart elements should be silently ignored, not throw TypeErrors.
Root Cause
SeriesModel.getData() can return null/undefined when a series is not alive. The comment in Series.ts explicitly acknowledges this:
// When series is not alive (that may happen when click toolbox
// restore or setOption with not merge mode), series data may
// be still need to judge animation or something when graphic
// elements want to know whether fade out.
return inner(this).data; // ← can be undefined
But getDataParams() and its 6 chart-specific overrides unconditionally access properties on the result. The event handler at echarts.ts calls getDataParams() on mouse events, which can fire on stale DOM elements after the series is disposed.
13+ vulnerable call sites identified:
dataFormat.ts — base getDataParams() calls data.getRawIndex(), data.getName(), etc.
echarts.ts:778 — event handler calls getDataParams() on potentially dead series
TreemapSeries.ts, SunburstSeries.ts, TreeSeries.ts — override accesses data.tree
PieSeries.ts — override accesses data.each(), data.mapDimension()
FunnelSeries.ts — override accesses data.mapDimension(), data.getSum()
ChordSeries.ts — override accesses data.getName(), this.getGraph()
TooltipView.ts:385, 458 — unguarded callers
Affects all chart types and all frameworks where component lifecycle causes chart disposal during user interaction.
Related Issues
Environment
- OS: macOS (also reproducible on Linux/Windows)
- Browser: Chrome, Firefox, Safari
- Framework: React 19 + Next.js 16 (but framework-agnostic)
Version
6.0.0 (bug present since at least 4.1.0)
Link to Minimal Reproduction
N/A — occurs in any framework (React, Vue, Angular) where chart components unmount during user interaction.
Steps to Reproduce
setOptionwith replacement data while the mouse cursor is over the chartmousemove/mouseoutevent fires afterdispose()clears the series dataCurrent Behavior
TypeError crashes:
Cannot read properties of undefined (reading 'getRawIndex')— fromDataFormatMixin.getDataParams()base methodCannot read properties of undefined (reading 'tree')— fromTreemapSeriesModel.getDataParams()override.each), funnel (.mapDimension), sunburst/tree (.tree), chord (.getName)Stack trace (Sankey example):
Stack trace (Treemap example):
Expected Behavior
Mouse events on disposed chart elements should be silently ignored, not throw TypeErrors.
Root Cause
SeriesModel.getData()can returnnull/undefinedwhen a series is not alive. The comment inSeries.tsexplicitly acknowledges this:But
getDataParams()and its 6 chart-specific overrides unconditionally access properties on the result. The event handler atecharts.tscallsgetDataParams()on mouse events, which can fire on stale DOM elements after the series is disposed.13+ vulnerable call sites identified:
dataFormat.ts— basegetDataParams()callsdata.getRawIndex(),data.getName(), etc.echarts.ts:778— event handler callsgetDataParams()on potentially dead seriesTreemapSeries.ts,SunburstSeries.ts,TreeSeries.ts— override accessesdata.treePieSeries.ts— override accessesdata.each(),data.mapDimension()FunnelSeries.ts— override accessesdata.mapDimension(),data.getSum()ChordSeries.ts— override accessesdata.getName(),this.getGraph()TooltipView.ts:385, 458— unguarded callersAffects all chart types and all frameworks where component lifecycle causes chart disposal during user interaction.
Related Issues
Environment