Skip to content

[Bug] TypeError in getDataParams when getData() returns null on disposed series #21535

@davesecops

Description

@davesecops

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

  1. Render any chart (sankey, treemap, pie, line) with mouse event handlers
  2. Navigate away (unmount the component) or call setOption with replacement data while the mouse cursor is over the chart
  3. 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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    enThis issue is in EnglishpendingWe are not sure about whether this is a bug/new feature.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions