unstale

npm / @tanstack/vue-table

@tanstack/vue-table

What changed in @tanstack/vue-table 9, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-19.

64 breaking2 deprecations29 new APIs and options1 performance2 behavior and defaults4 fixes and other

See which of these apply to your code, ranked, in your agent:

npx @unstale/cli init

@unstale/cli on npm

@tanstack/vue-table 9102 changes

Breaking changes 64

  • Bundled Intent skills now use smaller entry points with task-specific references; consumers with individual skill permissions or explicit agent mappings must replace retired IDs and refresh their mappings.

    9.2.6release notes

  • The callable AggregationFn and CreatedAggregationFn types were replaced by AggregationFnDef.

    9.0.0release notes

  • Register aggregation functions in the aggregationFns slot to use string references, replacing module augmentation.

    9.0.0release notes

  • The region argument now uses end instead of right.

    9.0.0release notes

  • column.getAggregationFn() was renamed because a column can run multiple aggregation definitions.

    9.0.0release notes

  • The method now takes one options object containing rows and maxDepth instead of positional arguments.

    9.0.0release notes

  • The column.getAutoSortingFn() method was renamed to column.getAutoSortFn().

    9.0.0release notes

  • The region argument now uses start/end instead of left/right.

    9.0.0release notes

  • The pinned-position result now uses start/end instead of left/right.

    9.0.0release notes

  • The column.getSortingFn() method was renamed to column.getSortFn().

    9.0.0release notes

  • The region argument now uses start instead of left.

    9.0.0release notes

  • Use start and end rather than left and right when pinning a column.

    9.0.0release notes

  • Global declaration merging still works, but ColumnMeta now takes TFeatures as its first generic parameter.

    9.0.0release notes

  • Column pinning state now uses logical start/end regions instead of left/right; there are no deprecated aliases.

    9.0.0release notes

  • Column pinning state now uses logical start/end regions instead of left/right; there are no deprecated aliases.

    9.0.0release notes

  • Column pinning now uses start/end terminology instead of the previous terminology.

    9.0.0release notes

  • The former columnSizingInfo state is now named columnResizing.

    9.0.0release notes

  • Interactive resizing is now a separate feature; import it alongside columnSizingFeature when drag-to-resize is needed.

    9.0.0release notes

  • Rename columnSizingInfo state to columnResizing, including related options.

    9.0.0release notes

  • Custom aggregation callables now use context-based definitions constructed with constructAggregationFn.

    9.0.0release notes

  • createColumnHelper now takes TFeatures before TData.

    9.0.0release notes

  • The combined enablePinning option was split into separate column-pinning and row-pinning options.

    9.0.0release notes

  • Replace enablePinning with enableColumnPinning or enableRowPinning.

    9.0.0release notes

  • Set this option to false to preserve the previous non-range handler behavior.

    9.0.0release notes

  • Compiled output now targets ES2022.

    9.0.0release notes

  • Packages ship as modern ESM; UMD and CJS builds are dropped.

    9.0.0release notes

  • Tables must explicitly declare their features through the new required features option; registering only needed features enables tree-shaking.

    9.0.0release notes

  • Register filter functions in the features registry slot to make string references typecheck, replacing FilterFns module augmentation.

    9.0.0release notes

  • Use the filterMeta registry slot to type filter metadata instead of augmenting FilterMeta.

    9.0.0release notes

  • Move get*RowModel() options to tableFeatures slots; row model factories no longer take arguments.

    9.0.0release notes

  • This column option controls which depth-selected rows are provided to aggregation; the default 0 preserves direct-child aggregation, while Infinity selects terminal leaf rows.

    9.0.0release notes

  • The onColumnSizingInfoChange option was renamed to onColumnResizingChange.

    9.0.0release notes

  • The table option was removed; subscribe to table.store to listen for any state change, while per-slice change handlers remain available.

    9.0.0release notes

  • Row model factories and filter, sort, and aggregation function registries are registered through tableFeatures rather than separate table options.

    9.0.0release notes

  • The row API for visible cells on the right was renamed to use logical end terminology.

    9.0.0release notes

  • The row API for visible cells on the left was renamed to use logical start terminology.

    9.0.0release notes

  • Aggregation is an independent feature; explicitly registered features must include rowAggregationFeature when columns use aggregation APIs.

    9.0.0release notes

  • RowData is now restricted to Record<string, any> or Array<any>, so unusual data types must conform to one of those shapes.

    9.0.0release notes

  • setColumnSizingInfo() was renamed to setColumnResizing().

    9.0.0release notes

  • The column definition option sortingFn was renamed to sortFn; update column definitions to use the new name.

    9.0.0release notes

  • The SortingFn type was renamed to SortFn.

    9.0.0release notes

  • The SortingFns interface was renamed to SortFns.

    9.0.0release notes

  • The built-in sorting functions identifier sortingFns was renamed to sortFns.

    9.0.0release notes

  • Register sort functions in the sortFns slot to use string references, replacing module augmentation.

    9.0.0release notes

  • Rename sortingFn to sortFn in column definitions.

    9.0.0release notes

  • This internal table API has been removed.

    9.0.0release notes

  • This internal table API has been removed.

    9.0.0release notes

  • This internal table API has been removed.

    9.0.0release notes

  • This internal table API has been removed.

    9.0.0release notes

  • The header-groups API for the right region was renamed to use logical end terminology.

    9.0.0release notes

  • The leaf-columns API for the right region was renamed to use logical end terminology.

    9.0.0release notes

  • The total-size API for the right region was renamed to use logical end terminology.

    9.0.0release notes

  • The visible leaf-columns API for the right region was renamed to use logical end terminology.

    9.0.0release notes

  • Now returns true whenever at least one page row is selected, including when all page rows are selected.

    9.0.0release notes

  • Now returns true whenever at least one row is selected, including when all rows are selected.

    9.0.0release notes

  • The header-groups API for the left region was renamed to use logical start terminology.

    9.0.0release notes

  • The leaf-columns API for the left region was renamed to use logical start terminology.

    9.0.0release notes

  • The total-size API for the left region was renamed to use logical start terminology.

    9.0.0release notes

  • The visible leaf-columns API for the left region was renamed to use logical start terminology.

    9.0.0release notes

  • Access state through table.store.state or table.state instead of table.getState().

    9.0.0release notes

  • Provides the selected table state directly; by default it contains all registered state, while a custom selector can limit its shape.

    9.0.0release notes

  • Global declaration merging still works, but TableMeta now takes TFeatures as its first generic parameter.

    9.0.0release notes

  • Most table types now take TFeatures as a generic parameter, which should be supplied when typing tables, columns, rows, and cells.

    9.0.0release notes

  • Use useTable in place of useReactTable for creating a table.

    9.0.0release notes

Deprecations 2

  • Deprecated in the Vue adapter; read table APIs or atoms in native Vue reactive contexts, and use a child component when a separate render boundary is needed. The wrapper remains for compatibility.

    9.2.7release notes

  • The full function registry export is deprecated in favor of importing and registering only the individual functions in use.

    9.0.0release notes

New APIs and options 29

  • Pass writable atoms for individual state slices; table reads and writes use those atoms, which take precedence over matching state options and are not cleared by table.reset().

    9.0.0release notes

  • Pass writable atoms through the atoms option to own specific state slices externally.

    9.0.0release notes

  • Adds spreadsheet-style rectangular cell-range selection, including drag selection, Shift-extend, and multiple disjoint ranges.

    9.0.0release notes

  • Adds body-cell spanning across rows and columns, with span-aware selection and header row-span computation.

    9.0.0release notes

  • Column grouping is separate from aggregation and is needed only when rows are also grouped.

    9.0.0release notes

  • Wrap column arrays with columns() to preserve each column's TValue type, including through nested group columns.

    9.0.0release notes

  • A type-only columnMeta slot on the features option lets you declare metadata types per table without declaration merging.

    9.0.0release notes

  • Column sizing is now a separate feature, allowing fixed-width tables to import sizing without interactive resizing.

    9.0.0release notes

  • Convert custom aggregation callables to constructAggregationFn({ aggregate, merge? }) definitions.

    9.0.0release notes

  • Creates a reusable custom hook with pre-bound configuration for applications whose tables share features, row models, options, or components.

    9.0.0release notes

  • Components registered via createTableHook can access table, header, and cell context through context hooks.

    9.0.0release notes

  • Row pinning now has its own option, separate from column pinning.

    9.0.0release notes

  • A component can render header, cell, or footer templates as an alternative to the existing flexRender function.

    9.0.0release notes

  • Lets callers provide writable atoms for state slices they want to own externally.

    9.0.0release notes

  • The public row.getAllCellsByColumnId() method replaces the previously private row._getAllCellsByColumnId().

    9.0.0release notes

  • Adds a row API for obtaining its display index.

    9.0.0release notes

  • Provides all features for Table V8-like behavior, as an alternative to registering features individually.

    9.0.0release notes

  • Use StockFeatures as the feature type when using stockFeatures with useTable.

    9.0.0release notes

  • Exposes readonly atoms for individual state slices, allowing fine-grained subscriptions.

    9.0.0release notes

  • Subscribe to individual state slices via table.atoms.<slice> and useSelector for narrower re-renders.

    9.0.0release notes

  • A component attached to the table instance renders header, cell, or footer templates as an alternative to flexRender.

    9.0.0release notes

  • Adds a table API for obtaining the maximum sub-row depth.

    9.0.0release notes

  • Exposes a framework-agnostic store for reading the full table state and subscribing to state changes.

    9.0.0release notes

  • Optionally use table.Subscribe for render optimizations.

    9.0.0release notes

  • Registers table features, row models, and processing function registries, enabling feature prerequisite type checks and tree-shaking.

    9.0.0release notes

  • Define table features with tableFeatures(), or use stockFeatures, and migrate get*RowModel() options to feature slots.

    9.0.0release notes

  • A type-only tableMeta slot on the features option lets you declare metadata types per table without declaration merging.

    9.0.0release notes

  • Provides type-safe composition of reusable table options and allows partial configurations to omit required fields.

    9.0.0release notes

  • Use tableOptions() for composable configurations.

    9.0.0release notes

Performance 1

  • Per-slice atoms can be used as narrow subscription sources, avoiding re-renders and full state snapshot construction for unrelated state changes.

    9.0.0release notes

Behavior and default changes 2

  • When rowSelectionFeature is enabled, the handler now supports inclusive Shift range selection by default; direct row.toggleSelected() calls are unchanged.

    9.0.0release notes

  • TanStack Table v9 is released as stable, with upgrade instructions available in the migration guide.

    9.0.0release notes

Fixes and other changes 4

  • AppCell now reads the current cell prop when a keyed loop reuses its wrapper, preventing stale snippet, slot, and useCellContext() values.

    9.3.1release notes

  • AppFooter now reads the current footer prop when a keyed loop reuses its wrapper, preventing stale values.

    9.3.1release notes

  • AppHeader now reads the current header prop when a keyed loop reuses its wrapper, preventing stale snippet, slot, and useHeaderContext() values.

    9.3.1release notes

  • Methods are shared on prototypes, so destructuring them loses the required this context; call them on their original instance.

    9.0.0release notes