TanStack Table
完全无样式的表头逻辑库(Headless Table),只提供数据和状态管理能力,将渲染完全交还给开发者
TanStack Table 是 TanStack 生态的核心成员,定位为完全无样式的表格逻辑引擎。不渲染任何 DOM 和 CSS,只提供排序、筛选、分组、分页等核心逻辑。支持 React、Vue、Solid、Svelte、Angular 等 8+ 框架。
TanStack Table
完全无样式的表头逻辑库(Headless Table),只提供数据和状态管理能力,将渲染完全交还给开发者。
技术简介说明
TanStack Table(前身为 React Table)是由 Tanner Linsley 创建的 TanStack 生态中的核心成员之一,定位为一个完全无样式(Headless)的表格逻辑引擎。它不渲染任何 DOM 元素,不附带任何 CSS 样式,只提供排序、筛选、分组、分页、行选择、聚合等表格核心逻辑的状态管理。开发者需要自行实现表格的 HTML 结构和样式。
这种设计理念的核心价值在于完全的控制权——开发者可以构建任何外观和交互的表格,而不受组件库预设结构的限制。TanStack Table 的框架无关核心配合 React、Vue、Solid、Svelte、Angular、Lit、Alpine 等框架适配器,使其成为跨框架表格逻辑的通用解决方案。
2026 年,TanStack Table 迎来了 v9 版本,带来了更强的 TypeScript 类型系统性能优化。同时,TanStack Intent initiative 将 AI Agent Skills 直接打包进 npm 模块,使 AI 编码助手能够正确理解和使用 TanStack Table 的 API,这在开源表格库中开创了先河。
基本信息
| 属性 | 详情 |
|---|---|
| 官网 | https://tanstack.com/table/latest |
| GitHub | https://github.com/tanstack/table |
| License | MIT(完全免费,无付费版) |
| 最新版本 | v8.21.4(2026 年 4 月);v9 Beta 开发中 |
| 主要维护者 | Tanner Linsley / TanStack 团队 |
| GitHub Stars | ~28,200+ |
| 框架支持 | React、Vue、Solid、Svelte、Angular、Lit、Alpine、原生 TS/JS |
| npm 包 | @tanstack/react-table、@tanstack/vue-table、@tanstack/table-core 等 |
快速上手
安装
# React
npm install @tanstack/react-table
# Vue
npm install @tanstack/vue-table
# Solid
npm install @tanstack/solid-table
# Svelte
npm install @tanstack/svelte-table
# Angular
npm install @tanstack/angular-table
# 核心(框架无关)
npm install @tanstack/table-core基础配置
// 无特殊配置文件
// TanStack Table 是纯逻辑库,零配置即可使用
// 只需导入对应框架的 adapter 即可最小示例
import React, { useMemo } from 'react';
import {
useReactTable,
getCoreRowModel,
getSortedRowModel,
flexRender,
createColumnHelper,
} from '@tanstack/react-table';
const columnHelper = createColumnHelper<Person>();
const columns = [
columnHelper.accessor('firstName', {
header: 'First Name',
cell: info => info.getValue(),
}),
columnHelper.accessor('lastName', {
header: 'Last Name',
cell: info => info.getValue(),
}),
columnHelper.accessor('age', {
header: 'Age',
}),
];
type Person = {
firstName: string;
lastName: string;
age: number;
};
const data: Person[] = [
{ firstName: 'John', lastName: 'Doe', age: 30 },
{ firstName: 'Jane', lastName: 'Smith', age: 25 },
];
function App() {
const table = useReactTable({
data,
columns,
getCoreRowModel: getCoreRowModel(),
getSortedRowModel: getSortedRowModel(),
});
return (
<table>
<thead>
{table.getHeaderGroups().map(headerGroup => (
<tr key={headerGroup.id}>
{headerGroup.headers.map(header => (
<th key={header.id}>
{header.isPlaceholder ? null : (
<div
onClick={header.column.getToggleSortingHandler()}
style={{ cursor: 'pointer' }}
>
{flexRender(
header.column.columnDef.header,
header.getContext()
)}
</div>
)}
</th>
))}
</tr>
))}
</thead>
<tbody>
{table.getRowModel().rows.map(row => (
<tr key={row.id}>
{row.getVisibleCells().map(cell => (
<td key={cell.id}>
{flexRender(cell.column.columnDef.cell, cell.getContext())}
</td>
))}
</tr>
))}
</tbody>
</table>
);
}核心概念与架构
Headless 架构
TanStack Table 的核心设计哲学是 "只提供大脑,不提供身体":
┌──────────────────────────────────────────┐
│ 你的 UI 组件(你自己写) │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ <th> │ │ <td> │ │ <tr> │ │ ... │ │
│ └──┬───┘ └──┬───┘ └──┬───┘ └──┬───┘ │
│ │ │ │ │ │
│ ┌────┴────────┴────────┴────────┴────┐ │
│ │ TanStack Table (逻辑层) │ │
│ │ • 排序状态 • 筛选状态 │ │
│ │ • 分组计算 • 分页计算 │ │
│ │ • 行选择 • 聚合计算 │ │
│ │ • 列可见性 • 展开/折叠 │ │
│ └────────────────────────────────────┘ │
│ ↕ │
│ 你的数据源(data props) │
└──────────────────────────────────────────┘
核心概念
- Table Instance:表格实例,由
useReactTable/useVueTable等 hook 创建,包含所有状态和计算结果 - Column Defs:列定义,声明每列的数据访问器、渲染函数、排序/筛选配置
- Row Model:行模型计算管线,包括 Core → Sorting → Filtering → Grouping → Pagination
- Header Groups:表头分组,支持多级表头
- Flex Render:安全的渲染函数,支持函数式 cell/header 渲染
核心特性
- 完全无样式:不生成任何 DOM 或 CSS,100% 由开发者控制 UI
- 框架无关核心:
@tanstack/table-core提供通用逻辑,各框架通过适配器接入 - 排序:单列/多列排序,自定义排序函数,绝对排序
- 筛选:全局筛选、列级筛选,支持自定义筛选函数和筛选 UI
- 分组:行分组、聚合计算(sum、min、max、mean、count 等)
- 分页:客户端分页,支持受控/非受控模式
- 行选择:单选/多选,支持全选、跨页选择保持
- 列可见性:动态显示/隐藏列
- 展开/折叠:子行展开,支持异步加载子数据
- 虚拟滚动支持:与
@tanstack/react-virtual配合实现虚拟滚动 - TypeScript 优先:完整的类型推导,v9 进一步优化类型性能
- AI Agent Skills:v9+ 通过 TanStack Intent 内置 AI 编码助手技能
生态图
┌──────────────────────────────────────────────────┐
│ TanStack 生态 │
├──────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌───────────────┐ ┌────────┐ │
│ │ TanStack │ │ TanStack │ │ TanStack│ │
│ │ Table │ │ Virtual │ │ Query │ │
│ │ (表格逻辑) │ │ (虚拟滚动) │ │ (数据) │ │
│ └──────┬──────┘ └──────┬──────┘ └───┬────┘ │
│ │ │ │ │
│ └────────────────┼──────────────┘ │
│ │ │
│ ┌───────────────────────┴──────────────────┐ │
│ │ 你的 UI 组件 │ │
│ │ (Tailwind / MUI / Ant Design / 自研) │ │
│ └──────────────────────────────────────────┘ │
│ │
│ 框架适配器: │
│ ├── @tanstack/react-table │
│ ├── @tanstack/vue-table │
│ ├── @tanstack/solid-table │
│ ├── @tanstack/svelte-table │
│ ├── @tanstack/angular-table │
│ ├── @tanstack/lit-table │
│ └── @tanstack/table-core (框架无关核心) │
│ │
│ 配套工具: │
│ ├── TanStack Intent (AI Agent Skills) │
│ ├── TanStack Form (表单管理) │
│ └── TanStack Router (路由管理) │
│ │
│ 社区 UI 封装(第三方): │
│ ├── Material React Table (MRT) │
│ ├── Mantine React Table │
│ └── 各种 Design System 集成 │
└──────────────────────────────────────────────────┘
关键依赖:零运行时依赖
相关生态项目:
@tanstack/react-virtual:虚拟滚动,与 TanStack Table 配合处理大数据量@tanstack/react-query:数据获取与缓存,提供服务端数据给表格- TanStack Intent:AI 编码助手技能包
第三方 UI 封装:
- Material React Table (MRT):基于 TanStack Table + MUI 的完整 UI 方案
- Mantine React Table:基于 TanStack Table + Mantine 的完整 UI 方案
适用场景
- 自定义设计系统:需要将表格完全融入自研 Design System 的场景
- 高度定制化的表格 UI:标准组件库无法满足的特殊表格交互需求
- 跨框架表格逻辑复用:一套表格逻辑同时支持 React/Vue/Angular 等多框架项目
- 轻量级表格:不需要完整数据网格的复杂功能,只需要排序/筛选/分页逻辑
- 教学与学习:理解表格底层原理,学习表格状态管理模式
- 与现有 UI 库深度集成:在 Tailwind、Radix、shadcn/ui 等体系上构建表格
- 预算有限的团队:完全免费开源,无需商业许可
开发与工程化
开发流程
# 安装核心包 + 框架适配器
npm install @tanstack/react-table
# 可选:虚拟滚动
npm install @tanstack/react-virtual
# 可选:数据获取
npm install @tanstack/react-query工程化最佳实践
- 使用
createColumnHelper:获得完整的类型推导 - 配合 React Virtual 处理大数据:超过 1000 行时启用虚拟滚动
- 服务端数据模式:结合 TanStack Query 实现服务端排序/筛选/分页
useMemo缓存:data和columns应使用useMemo避免不必要的重新计算- 受控 vs 非受控:根据需求选择状态管理模式,复杂表单场景推荐受控模式
CI/CD 集成
- TanStack Table 作为纯逻辑库,无构建配置要求
- 建议开启 TypeScript 严格模式以获得完整类型安全
- v9 的类型系统更复杂,CI 中的 typecheck 尤为重要
性能与安全
性能特点
- 纯逻辑计算:不操作 DOM,性能开销极低
- 惰性计算:Row Model 按需计算,不触发不必要的重渲染
- 与 Virtual 配合:结合
@tanstack/react-virtual可流畅渲染百万行 - Tree-shaking 友好:ESM 模块,支持按需导入
已知性能瓶颈
- 堆内存增长:基准测试(ITNEXT 2026)显示,TanStack Table + Virtual 在 5 万行数据下堆内存增长较高
- 大量列定义:数百列时列定义的计算开销增加
- 复杂聚合:分组 + 多层聚合时计算开销较高
- 非受控模式大数据:全量客户端数据 + 非受控状态可能导致帧率下降
安全注意事项
- TanStack Table 是纯逻辑库,不直接产生 HTML,XSS 风险取决于渲染层
- 确保
cell和header渲染函数对用户输入进行适当转义 - 服务端数据模式下注意接口鉴权和速率限制
技术对比
| 特性 | TanStack Table | AG Grid | Handsontable | Tabulator | RevoGrid |
|---|---|---|---|---|---|
| 核心理念 | 无样式逻辑库 | 全功能数据网格 | 电子表格式网格 | 交互式表格 | 虚拟数据网格 |
| 费用 | 完全免费 | Enterprise $999/年 | $999/年 | 完全免费 | Pro 版收费 |
| 自带 UI | ❌ | ✅ | ✅ | ✅ | ✅ |
| 学习曲线 | 中高(需理解全部概念) | 中(API 庞大但文档完善) | 低 | 低 | 中 |
| 自定义能力 | 无限(完全控制 DOM) | 受限于内部结构 | 中等 | 中等 | 中等 |
| 排序/筛选 | ✅ 内置逻辑 | ✅ 内置 + UI | ✅ 内置 + UI | ✅ 内置 + UI | ✅ 内置 + UI |
| 行分组 | ✅ | ✅ Enterprise | ❌ | ✅ | ✅ |
| 虚拟滚动 | 需配合 Virtual | ✅ 内置 | ✅ 内置 | ✅ 内置 | ✅ 核心优势 |
| 框架支持 | 7+ 框架 | 4 框架 | 4 框架 | 4 框架 | 6+ 框架 |
| TypeScript | ✅ 完整类型 | ✅ | ✅ v18+ | ❌ | ✅ |
| AI 能力 | ✅ Intent (Agent Skills) | ✅ AI Toolkit | ❌ | ❌ | ✅ MCP |
| 服务端数据 | ✅ 自行实现 | ✅ 内置多模式 | ✅ | ✅ | ✅ |
| 包体积 | 极小(~15KB gzip) | 大 | 大 | 中 | 中 |
最佳实践
生产环境建议
- 始终使用
createColumnHelper:确保类型安全 - 大数据量配合 Virtual:安装
@tanstack/react-virtual实现虚拟滚动 - 服务端模式用 TanStack Query:数据获取、缓存、乐观更新一站式解决
- 用
useMemo包裹 data 和 columns:避免不必要的重渲染 - 选择合适的 Row Model 管线:只注册需要的功能(如只需排序就不注册分组)
- 利用社区 UI 封装:如果不想从零实现 UI,考虑 Material React Table 或 Mantine React Table
常见陷阱
- ❌ 忘记
useMemo导致每次渲染都创建新的列定义 → ✅ 始终缓存 columns - ❌ 客户端处理百万行数据 → ✅ 实现服务端排序/筛选/分页
- ❌ 忽略 v8 到 v9 的类型变更 → ✅ 参考官方迁移指南
- ❌ 试图用 TanStack Table 做 Excel 级编辑 → ✅ 这种需求应选 Handsontable
技术局限与边界
已知限制
- 不提供任何 UI:所有的表格渲染、样式、交互都需要自行实现
- 没有内置编辑功能:单元格编辑需要自行实现状态管理和 UI
- 没有内置导出:CSV/Excel 导出需要自行实现或引入第三方库
- 没有内置图表:不能在表格内嵌图表
- 学习成本:需要深入理解 Table Instance、Row Model、Header Groups 等概念
- 调试复杂度:无 UI 意味着所有调试都在逻辑层进行
不适用场景
- 需要"开箱即用"的完整表格 UI(选 AG Grid 或 Handsontable)
- 电子表格类编辑需求(选 Handsontable)
- 需要集成图表的 BI 场景(选 AG Grid)
- 快速原型开发,不想花时间写表格 UI
迁移注意事项
- v8 → v9 类型系统有较大变化,需参考迁移指南
- 从 React Table v7 迁移到 TanStack Table v8+ 是重大变更(包名、API 全变)
- 从其他表格库迁移到 TanStack Table 意味着重写全部表格 UI
学习资源
官方文档
- TanStack Table 官方文档 - 完整的 API 参考
- TanStack Table 概览 - 架构设计说明
- TanStack Table GitHub - 源码和 Issue
- TanStack Intent Registry - AI Agent Skills 注册表
教程
- Building Powerful Data Tables with TanStack Table in React - Dev.to 教程
- TanStack Table in React: Everything You Need to Know - Agility CMS 指南
- TypeScript Performance in TanStack Table V9 - v9 类型性能详解
社区资源
- TanStack Discord - 官方 Discord
- GitHub Discussions
- Reddit: r/reactjs - 活跃讨论
- Material React Table - 最流行的 UI 封装
- Stack Overflow: tanstack-table 标签
2026 年现状
最新版本
- v8.21.4(2026-04-03):当前稳定版,全框架适配器同步发布
- v9 Beta:开发中,重点改进 TypeScript 类型系统性能
发展趋势
- v9 TypeScript 优化:更高效的类型推导,减少 IDE 和编译器的类型计算负担
- TanStack Intent 整合:将 AI Agent Skills 随 npm 包分发,让 AI 编码助手更好地理解 API
- 框架适配器持续扩展:Lit、Alpine 等新框架的适配器持续完善
- 社区 UI 封装繁荣:Material React Table、Mantine React Table 等第三方 UI 方案日趋成熟
社区活跃度
- GitHub Stars:28,200+(同类无样式表格库中最高)
- npm 下载量:React 适配器周下载量数十万
- 更新频率:持续活跃,bug fix 和新特性并行推进
- 社区规模:TanStack Discord 活跃用户群体庞大
未来路线图
- v9 正式版发布(TypeScript 类型系统重构)
- TanStack Intent 生态成熟,AI 编码助手原生支持
- 更多框架适配器和社区 UI 封装
- 与 TanStack Query、TanStack Virtual 的更深度集成模式