All products
React Library

React Data Grid

The data table your framework should have shipped with.

Cut your admin UI from 3 weeks to 3 days.
See use cases ↓
One-time paymentLifetime updatesCommercial license
Users·1,248
NameEmailRolePlan
Ada Lovelaceada@analytical.devAdminTeam
Grace Hoppergrace@navy.milMemberPro
Linus T.linus@kernel.orgAdminTeam
Margaret H.margaret@nasa.govMemberPro
Donald K.donald@cs.stanfordMemberFree
Showing 5 of 1,248Page 1 of 250

100k+

Rows at 60fps

10 min

Time to first grid

3

Export formats

What you can build with it

Real scenarios where this pays for itself.

01

Admin user management

List, search, filter, edit, bulk-delete, export — every admin action, in one grid, no glue code.

The 'users' page takes an afternoon.
02

Customer-facing dashboards

Show the user their own data — transactions, projects, tickets — with inline edits and instant save.

Dashboards that don't feel like spreadsheets.
03

Internal ops & finance

100k+ row datasets with server-side pagination, sort, and filter. Export to Excel for the CFO.

The reports your CFO keeps asking for.
04

Data explorers

Type-safe column definitions, custom cell renderers, column groups. Build a Notion-grade data UI.

Stop writing the same table component twice.

Built for

If any of these are you, this is for you.

Frontend engineers building admin UIFull-stack devs who hate writing tablesTeams standardising on TanStack TableAnyone shipping a CRUD app
Built withReact 18+TypeScriptTanStack TableTailwind CSS

What's under the hood

Three things that earn their place in your stack.

100k rows, no jank

Row virtualization is on by default. Scroll a 100k-row table on a mid-range laptop and watch the frame rate hold.

Click to edit anything

Cells are editable out of the box. Hook `onRowEdit` to your server and you've got a CRUD UI in five minutes.

Export built in

CSV, Excel, PDF — all one click, all respecting the current sort & filter. The reports your PM keeps asking for are already there.

Quick start

Install and ship in under a minute.

terminal
$npm install react-data-grid @tanstack/react-table
$# Drop into your routes
$npm run dev
$# Try sort, filter, edit, export

What's in the box

  • DataGrid component
    the main grid
  • useDataGrid hook
    for custom UIs
  • Type-safe Column API
    full TypeScript inference
  • CSV / Excel / PDF export
    respects sort + filter
  • Inline edit handlers
    cell + row level
  • Server-side data adapter
    TanStack Query, SWR, or fetch
  • Column groups & pinning
    left/right, resizable
  • Full source + docs
    no obfuscation

Full feature list

What makes this a real product, not a weekend hack.

Virtualized rows for 100k+ datasets
Inline cell editing (click to edit)
Column sorting, filtering, resizing, reordering
Row selection (single & multi)
Pagination & infinite scroll
Export to CSV, Excel, PDF
Dark mode & responsive
Type-safe column definitions

Works with

Tested against the React stack you already use.

React 18+
peer dep
TanStack Table 8+
peer dep
TanStack Query
server data
SWR / fetch
server data
Vite / Next.js / Remix
tested
Tailwind CSS
styling

Full documentation

Everything in the package, every prop, every pattern.

React Data Grid

A polished, performant data table with inline editing, sorting, filtering, selection, and export.

Quick Start

npm install react-data-grid @tanstack/react-table

Usage

Basic table

import { DataGrid } from 'react-data-grid'

const columns = [
  { id: 'name', header: 'Name', accessorKey: 'name' },
  { id: 'email', header: 'Email', accessorKey: 'email' },
  { id: 'age', header: 'Age', accessorKey: 'age' },
]

const data = [
  { name: 'Alice', email: 'alice@example.com', age: 30 },
  { name: 'Bob', email: 'bob@example.com', age: 25 },
]

function App() {
  return <DataGrid columns={columns} data={data} />
}

With all features

<DataGrid
  columns={columns}
  data={largeDataset}
  pageSize={50}
  sorting={true}
  filtering={true}
  selection="multi"
  inlineEditing={true}
  exportable={true}
  striped={true}
  darkMode={false}
  onRowClick={(row) => console.log('Clicked:', row)}
/>

Inline editing

Double-click any cell to edit. Supports text, number, and select editors.

const columns = [
  {
    id: 'name',
    header: 'Name',
    accessorKey: 'name',
    enableEditing: true,
  },
  {
    id: 'status',
    header: 'Status',
    accessorKey: 'status',
    enableEditing: true,
    cellEditor: ({ value, onSave, onCancel }) => (
      <select
        value={String(value)}
        onChange={(e) => onSave(e.target.value)}
        onBlur={(e) => onSave(e.target.value)}
        autoFocus
      >
        <option value="active">Active</option>
        <option value="inactive">Inactive</option>
        <option value="pending">Pending</option>
      </select>
    ),
  },
]

Export

import { exportToCSV, exportToExcel } from 'react-data-grid'

// Via toolbar buttons
<DataGrid columns={cols} data={data} exportable={true} />

// Or programmatically
exportToCSV(data, columns, 'my-export.csv')
exportToExcel(data, columns, 'my-export.xls')

API

DataGrid

PropTypeDefaultDescription
columnsColumnDef<T>[]requiredColumn definitions
dataT[]requiredRow data
pageSizenumber20Rows per page
paginationbooleantrueShow pagination
sortingbooleantrueEnable column sorting
filteringbooleanfalseEnable column filters
selectionboolean | 'multi'falseEnable row selection
inlineEditingbooleanfalseEnable inline cell editing
exportablebooleanfalseShow CSV/Excel export buttons
stripedbooleantrueAlternating row colors
darkModebooleanfalseDark theme
loadingbooleanfalseShow loading state
emptyTextstring'No data'Empty state message
maxHeightstring | numberMax table body height
hideHeaderbooleanfalseHide column headers
onRowClick(row) => voidRow click handler
onDataChange(rows) => voidData mutation handler
onSelectionChange(ids) => voidSelection change handler

ColumnDef

PropTypeDefaultDescription
idstringrequiredUnique column ID
headerstringrequiredColumn header text
accessorKeykeyof TData accessor
accessorFn(row) => unknownCustom accessor
cell(props) => ReactNodeCustom cell renderer
enableSortingbooleantrueSortable
enableFilteringbooleantrueFilterable
enableEditingbooleanfalseInline editable
widthnumber | stringColumn width
cellEditor(props) => ReactNodeCustom edit component
pinned'left' | 'right'Sticky column
visiblebooleantrueShow/hide column

Common questions

Things people ask before buying.

Does it work without TanStack Table?

No — TanStack Table is a peer dep. It's the best headless table library for React and it's tiny. We do the UI heavy-lifting on top of it.

Can I bring my own server-side data fetching?

Yes. Pass a `fetcher` prop and the grid handles pagination, sort, and filter params for you. Bring TanStack Query, SWR, or fetch — your call.

Does it support column groups and pinned columns?

Yes — `columnGroups`, `pinned: 'left' | 'right'`, and resizable handles are all first-class. The API matches the conventions of spreadsheet tools.

What about Excel-style formulas?

No. This is a data grid, not a spreadsheet. If you need formula evaluation, use a dedicated library alongside.

£15 — lifetime

One purchase. Yours forever.

Pay once via Stripe. Get the complete package instantly. Free updates for the same major version. Commercial license included.

Secure payment via Stripe · Instant download · 30-day money-back if it doesn't save you time