React data grid

React data grid for modern product workflows

Ace Grid is built for React teams that need a real data-grid surface: editable cells, virtualized rows and columns, pinned regions, filtering, theming, CSV workflows, and a path into spreadsheet, enterprise, and AI workflows.

Install Ace Grid Open Core API

Use a grid when the table has become a tool

A read-only list does not need a data grid. Ace Grid becomes useful when people edit values, select records, filter repeatedly, pin columns, or navigate by keyboard. If the screen only displays a few rows, use a semantic table and keep the implementation smaller.

Start with rows, columns, and stable IDs

The example below has two inputs: rows that represent customer records and columns that describe how each field behaves. Keep row IDs stable through sorting, filtering, and updates. Use explicit column keys and value types. Those two choices prevent most selection, editing, and virtualization bugs before they start.

Keep saved data in your application

Ace Grid can edit a cell and report the change, but your application still owns the record. In a typical save flow, update local state, send the change to the API, and show a cell-level error if the server rejects it. Add conflict handling only when the backend actually supports record versions; a basic editable grid does not need an elaborate transaction system.

Prototype the difficult row, not the easy one

Use real column widths, the densest custom cell, one editor, one validation error, and enough rows to exercise scrolling. Then test keyboard navigation, dark mode, loading, empty results, and a failed save. This small fixture reveals more than a polished demo filled with simple text cells.

Measure the workflow users will perform

Test initial render, fast scrolling, edit start, filtering, and resizing on the devices your users have. Row count is only one cost: wide grids and expensive custom renderers can matter more. Ace Grid supports row and column virtualization; turn on cell-content virtualization only when profiling shows that inner cell content is the bottleneck.

Choose the smallest tier that covers the job

Core is MIT licensed and covers editing, selection, sorting, filtering, pagination, pinning, resizing, virtualization, CSV workflows, and theming. Move to Pro for spreadsheet features such as formulas, advanced validation, Excel I/O, grouping, or tree data. Enterprise is for server row model, charts, pivoting, and master-detail. Do not choose a paid tier until the prototype proves you need it.

Product evidence

Core feature boundary

@ace-grid/core includes editing, selection, sorting, filtering, pagination, search, pinning, resizing, virtualization, CSV I/O, theming, and schema-aware grid state helpers under the MIT license.

Framework-specific packages

React uses @ace-grid/core directly. Ace Grid also publishes Web Component, Angular, Vue, and Svelte wrappers for applications that do not render the React component directly.

Live Ace Grid example

Core product grid

A real Ace Grid Core surface with editable customer rows, segment pills, status, ARR, health, and structured payload data.

CompanySegmentStatusARRHealthNext
HelioBankEnterpriseLive$820k94%Renew
Northstar AIStrategicLive$640k88%Expand
VaultPayEnterpriseReview$410k79%Validate
QuantivaMarketEscalate$295k62%Rescue

Production-shaped Core example

import { Grid, type CellValue, type GridColumn, type GridRow } from "@ace-grid/core";

const cell = (value: unknown, type: CellValue["type"] = "text"): CellValue => ({ value, type });

const rows: GridRow[] = [
  { id: "1", data: { company: cell("HelioBank"), owner: cell("Maya"), segment: cell("Enterprise"), status: cell("Live") } },
  { id: "2", data: { company: cell("Northstar AI"), owner: cell("Theo"), segment: cell("Strategic"), status: cell("Live") } },
];

const columns: GridColumn[] = [
  { key: "company", title: "Company", editable: true, sortable: true, filterable: true, width: 240 },
  { key: "owner", title: "Owner", editable: true, width: 160 },
  { key: "segment", title: "Segment", type: "select", options: ["Enterprise", "Strategic", "Market"], filterable: true, width: 180 },
  { key: "status", title: "Status", editable: true, filterable: true, width: 140 },
];

export function ProductGrid() {
  return (
    <Grid
      data={{ rows, columns }}
      columns={{ columnWidths: Object.fromEntries(columns.map((column) => [column.key, column.width ?? 160])), fillWidth: true }}
      layout={{ width: 1200, height: 520 }}
      virtual={{ enableVirtualization: true, enableHorizontalVirtualization: true }}
    />
  );
}

Choose the right React table abstraction

Use case Ace Grid fit Simpler option
Small read-only list Usually more component than the screen needs Use semantic HTML or a headless table
Editable product surface Built-in grid interaction and MIT Core adoption Custom table behavior becomes application code
Spreadsheet workflow Add Pro only for formulas, validation, Excel I/O, grouping, and related features Avoid paying for or building features the workflow does not use

Limitations and tradeoffs

  • Use a semantic table or headless table for small, mostly read-only views that need custom markup more than grid interaction.
  • Use a workbook component when sheets, arbitrary ranges, macros, or document fidelity are the product.

Common questions

Is Ace Grid Core free to use?

@ace-grid/core is MIT licensed. Pro and Enterprise are commercial packages for spreadsheet and server-backed capabilities.

Sources