← Back to list

tanstack-table
by oakoss
Open-source SaaS starter kit with React, TanStack, and Better Auth
⭐ 0🍴 0📅 Jan 26, 2026
SKILL.md
name: tanstack-table description: Build data tables with TanStack Table and React Aria Components. Use when creating tables, implementing sorting, filtering, pagination, row selection, or column visibility.
TanStack Table
Quick Start
pnpm add @tanstack/react-table
import {
flexRender,
getCoreRowModel,
useReactTable,
type ColumnDef,
} from '@tanstack/react-table';
const columns: ColumnDef<Person>[] = [
{ accessorKey: 'name', header: 'Name' },
{ accessorKey: 'email', header: 'Email' },
];
function DataTable({ data }: { data: Person[] }) {
const table = useReactTable({
data,
columns,
getCoreRowModel: getCoreRowModel(),
});
return (
<table className="w-full border-collapse">
<thead>
{table.getHeaderGroups().map((headerGroup) => (
<tr key={headerGroup.id}>
{headerGroup.headers.map((header) => (
<th key={header.id} className="border p-2 text-left">
{flexRender(
header.column.columnDef.header,
header.getContext(),
)}
</th>
))}
</tr>
))}
</thead>
<tbody>
{table.getRowModel().rows.map((row) => (
<tr key={row.id}>
{row.getVisibleCells().map((cell) => (
<td key={cell.id} className="border p-2">
{flexRender(cell.column.columnDef.cell, cell.getContext())}
</td>
))}
</tr>
))}
</tbody>
</table>
);
}
Row Models
Import only what you need:
import {
getCoreRowModel, // Required
getSortedRowModel, // Sorting
getFilteredRowModel, // Filtering
getPaginationRowModel, // Pagination
} from '@tanstack/react-table';
Column Definitions
// Basic
{ accessorKey: 'email', header: 'Email' }
// Computed value
{ accessorFn: (row) => `${row.first} ${row.last}`, id: 'fullName', header: 'Name' }
// Custom cell
{
accessorKey: 'amount',
cell: ({ row }) => formatCurrency(row.getValue('amount')),
}
// Actions column
{
id: 'actions',
cell: ({ row }) => <ActionMenu item={row.original} />,
}
State Management Pattern
const [sorting, setSorting] = useState<SortingState>([]);
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);
const [rowSelection, setRowSelection] = useState<RowSelectionState>({});
const table = useReactTable({
data,
columns,
state: { sorting, columnFilters, rowSelection },
onSortingChange: setSorting,
onColumnFiltersChange: setColumnFilters,
onRowSelectionChange: setRowSelection,
getCoreRowModel: getCoreRowModel(),
getSortedRowModel: getSortedRowModel(),
getFilteredRowModel: getFilteredRowModel(),
});
Common Operations
| Task | Method |
|---|---|
| Sort column | column.toggleSorting() |
| Filter column | column.setFilterValue(value) |
| Next page | table.nextPage() |
| Select row | row.toggleSelected() |
| Hide column | column.toggleVisibility() |
| Get original data | row.original |
Project Structure
apps/web/src/routes/payments/
├── columns.tsx # Column definitions
├── data-table.tsx # DataTable component
└── index.tsx # Route (fetches data)
Common Mistakes
| Mistake | Correct Pattern |
|---|---|
Missing getCoreRowModel | Always required as base row model |
| Importing all row models | Only import what you use |
Not using flexRender | Required for both static and dynamic content |
Missing key on rows | Use row.id as key |
| Accessing data directly | Use row.original for the original data |
| Client pagination for large data | Use manualPagination: true for server-side |
| Missing table state | Control sorting/filtering via state props |
| Over-abstracting table | Each table is unique, don't create generic wrappers |
Delegation
- Pattern discovery: For finding existing table implementations, use
Exploreagent - Code review: After implementing tables, delegate to
code-revieweragent
Topic References
- Server Pagination - Server-side pagination, URL sync, faceted filters
- Infinite Scroll - Cursor pagination, intersection observer, virtual scrolling
- Column Definitions - Headers, cells, sorting, filtering, visibility
- Reusable Components - DataTable components, skeletons, full example
Score
Total Score
65/100
Based on repository quality metrics
✓SKILL.md
SKILL.mdファイルが含まれている
+20
✓LICENSE
ライセンスが設定されている
+10
○説明文
100文字以上の説明がある
0/10
○人気
GitHub Stars 100以上
0/15
✓最近の活動
1ヶ月以内に更新
+10
○フォーク
10回以上フォークされている
0/5
✓Issue管理
オープンIssueが50未満
+5
✓言語
プログラミング言語が設定されている
+5
✓タグ
1つ以上のタグが設定されている
+5
Reviews
💬
Reviews coming soon

