-
Notifications
You must be signed in to change notification settings - Fork 19.8k
Description
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
setOptionwith replacement data while the mouse cursor is over the chart - A stale
mousemove/mouseoutevent fires afterdispose()clears the series data
Current Behavior
TypeError crashes:
Cannot read properties of undefined (reading 'getRawIndex')— fromDataFormatMixin.getDataParams()base methodCannot read properties of undefined (reading 'tree')— fromTreemapSeriesModel.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 undefinedBut 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— 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 callers
Affects all chart types and all frameworks where component lifecycle causes chart disposal during user interaction.
Related Issues
- Cannot read property 'getRawIndex' of undefined #9402 — Original report (pie chart, closed 2018 as "cannot-reproduce" but never fixed)
- [Bug] get error [undefined (reading 'getRawIndex') ] when click on stackline chart #16998 — Same error on stacked line chart (open)
Environment
- OS: macOS (also reproducible on Linux/Windows)
- Browser: Chrome, Firefox, Safari
- Framework: React 19 + Next.js 16 (but framework-agnostic)