产品与设计
用 TanStack Table v8…
在 React 中构建数据表格(分页、过滤、排序、虚拟化)并需要与服务端 API、TanStack Query 或 Cloudflare D1 协调时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 TanStack Table v8 通用
解决思路
- 安装依赖:`bun add @tanstack/react-table@latest`;如需虚拟化加 `bun add @tanstack/react-virtual@latest`;如需模糊/全局搜索加 `bun add @tanstack/match-sorter-utils@latest`。
- 基础表格用 `useReactTable` 配合 `getCoreRowModel()`(必需),并用 `table.getHeaderGroups()` 渲染表头、`table.getRowModel().rows` 渲染行、`row.getVisibleCells()` 渲染单元格。
- 始终用 `useMemo` 或 `useState` 稳定 `data` 和 `columns` 引用(或定义在组件外),避免无限重渲染。
- 服务端分页:在 API 端用 `LIMIT ? OFFSET ?` 查询并用 `SELECT COUNT(*)` 取总数,返回 `data` 与 `pagination`(page、pageSize、total、pageCount)。
- 客户端用 `useState<PaginationState>` 管理分页,用 `useQuery` 拉取数据,并在 `useReactTable` 中设置 `manualPagination: true`、`pageCount`、`state: { pagination }`、`onPaginationChange: setPagination`。
- 服务端过滤:API 用 `WHERE name LIKE ? OR email LIKE ?` 接收 search 参数;客户端用 `useState<ColumnFiltersState>` 管理过滤,并设置 `manualFiltering: true`、`state: { columnFilters }`、`onColumnFiltersChange: setColumnFilters`。
- 服务端排序:把 sorting 加入 query key 并拼接 `sortBy`/`sortOrder` 参数,在表格中设置 `manualSorting: true`、`state: { sorting }`、`onSortingChange: setSorting`。
- TanStack Query 的 queryKey 必须包含全部表格状态(如 `['users', pagination.pageIndex, pagination.pageSize, columnFilters, sorting]`),否则会出现数据不同步。
- 大数据集(1000+ 行)用 `useVirtualizer`:传入 `count: rows.length`、`getScrollElement`、`estimateSize`(行高)、`overscan`,并用 `rowVirtualizer.getVirtualItems()` 配合绝对定位 `transform: translateY(...)` 渲染可见行。
- 用 `createColumnHelper<YourType>()` 定义类型安全列,从 `@tanstack/react-table` 导入(不是 `@tanstack/table-core`)。
- 提供加载与错误状态:`if (isLoading) return <TableSkeleton />`、`if (error) return <ErrorMessage error={error} />`。
- 只控制必要的状态(sorting、pagination、filters、visibility、pinning、order、selection);避免控制 `columnSizingInfo`,除非需要持久化拖拽状态,否则会引发频繁更新影响性能。
- 与 shadcn/ui 集成时,用 `Table`、`TableHeader`、`TableBody`、`TableRow`、`TableHead`、`TableCell` 组件包裹 TanStack Table 的渲染逻辑。
- 与 Cloudflare D1 集成时,在 Workers 的 `onRequestGet` 中用 `env.DB.prepare(...).bind(...).all()` 查询并返回 `Response.json({ data: results })`,客户端用 `useQuery` 消费。
- 按需加载参考文档:遇到重渲染/状态不同步/服务端特性失效等问题加载 `references/common-errors.md`;实现服务端分页过滤排序加载 `references/server-side-patterns.md`;协调 Query 加载 `references/query-integration.md`;Cloudflare D1 集成加载 `references/cloudflare-d1-examples.md`;虚拟化加载 `references/performance-virtualization.md`;列可见性/固定/排序/模糊搜索/行选择加载 `references/feature-controls.md`。
适用边界 · 注意事项
- 不使用 React(该技能面向 React 16.8+ 至 React 19,且不支持 React Compiler)。
- 数据量小于 1000 行且无需服务端特性时,不必引入服务端分页或虚拟化等复杂模式。
- 不依赖 Cloudflare Workers/D1 时,可跳过相关集成部分,改用其他后端。