mcpField
T
tanstack-table

tanstack-table

github.com/marcioaltoe开发062 次安装1 天前更新
代码仓库

关于 tanstack-table

TanStack Table 是面向数据密集型界面的模块化 React 表格库。本技能介绍安装方式,以及类型化列定义、行模型和受控表格状态的用法。

主要功能

  1. 01模块化行模型流程
  2. 02类型安全的列定义
  3. 03排序与筛选模式
  4. 04分页和选择状态
  5. 05列可见性与尺寸指导

适用场景

  1. 01构建可排序的数据表
  2. 02添加列筛选与全局筛选
  3. 03控制分页和行选择
  4. 04动态显示或调整列宽

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/marcioaltoe/skills --skill tanstack-table

安装后在 Claude Code 中输入/tanstack-table确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

agents/
openai.yaml
rules/
col-column-defs.md
exp-expanding.md
filt-column-filtering.md
filt-global-filtering.md
pag-pagination.md
rm-row-models.md
sel-row-selection.md
size-column-sizing.md
sort-sorting.md
table-setup.md
vis-column-visibility.md

详细介绍

TanStack Table

版本:@tanstack/react-table@latest 要求:React 16.8+,建议使用 TypeScript

快速设置

npm install @tanstack/react-table
import {
  useReactTable,
  getCoreRowModel,
  flexRender,
  createColumnHelper,
} from '@tanstack/react-table'

type User = {
  name: string
  age: number
  status: string
}

const columnHelper = createColumnHelper<User>()

const columns = [
  columnHelper.accessor('name', { header: 'Name' }),
  columnHelper.accessor('age', { header: 'Age' }),
  columnHelper.accessor('status', { header: 'Status' }),
  columnHelper.display({
    id: 'actions',
    cell: (props) => <button onClick={() => edit(props.row.original)}>Edit</button>,
  }),
]

function App() {
  const [data] = useState<User[]>([]) // must be stable reference

  const table = useReactTable({
    data,
    columns,
    getCoreRowModel: getCoreRowModel(),
  })

  return (
    <table>
      <thead>
        {table.getHeaderGroups().map((headerGroup) => (
          <tr key={headerGroup.id}>
            {headerGroup.headers.map((header) => (
              <th key={header.id}>
                {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}>
                {flexRender(cell.column.columnDef.cell, cell.getContext())}
              </td>
            ))}
          </tr>
        ))}
      </tbody>
    </table>
  )
}
行模型(仅导入所需内容)

TanStack Table 采用模块化设计。仅导入实际使用的行模型:

import {
  getCoreRowModel,      // required
  getSortedRowModel,    // client-side sorting
  getFilteredRowModel,  // client-side filtering
  getPaginationRowModel,// client-side pagination
  getExpandedRowModel,  // expanding/sub-rows
  getGroupedRowModel,   // grouping + aggregation
  getFacetedRowModel,   // faceted values
  getFacetedUniqueValues,
  getFacetedMinMaxValues,
} from '@tanstack/react-table'

处理管道顺序:Core -> Filtered -> Grouped -> Sorted -> Expanded -> Paginated -> Rendered

规则类别

优先级类别规则文件影响
CRITICAL表格设置rules/table-setup.md正确创建表格,保持数据引用稳定
CRITICAL列定义rules/col-column-defs.md数据模型、渲染、类型安全
CRITICAL行模型rules/rm-row-models.md模块化导入,处理管道顺序
HIGH排序rules/sort-sorting.md客户端/服务端排序,自定义排序函数
HIGH列筛选rules/filt-column-filtering.md按列筛选,自定义筛选函数
HIGH全局筛选rules/filt-global-filtering.md全表搜索,全局筛选函数
HIGH分页rules/pag-pagination.md客户端/服务端分页,页面状态
MEDIUM行选择rules/sel-row-selection.md复选框/单选框选择,选择状态
MEDIUM列可见性rules/vis-column-visibility.md动态显示/隐藏列
MEDIUM列宽调整rules/size-column-sizing.md列宽、调整大小、性能
LOW展开rules/exp-expanding.md子行、详情面板、层级数据

关键规则

始终遵循
  • 保持 data 引用稳定——使用 useState、useMemo,或在组件外定义,以避免无限重新渲染
  • 使用 createColumnHelper<TData>()——确保列定义具有最高的类型安全性
  • 仅导入所需的行模型——如果不进行客户端排序,就不要导入 getSortedRowModel
  • 使用 flexRender——渲染列定义中的表头/单元格/页脚模板
  • 使用 getVisibleCells()——不要使用 getAllCells(),以遵循列可见性设置
  • 使用 getRowModel()——获取应用所有功能(筛选、排序、分页)后的最终行模型
  • 使用 state + on*Change 控制状态——用于排序、筛选、分页、选择等
绝不这样做
  • 内联定义 data——useReactTable({ data: fetchData() }) 会导致无限重新渲染
  • 在渲染期间定义 columns——列数组必须保持稳定(在组件外定义或使用 useMemo)
  • 使用 getAllCells() 进行渲染——它会忽略列可见性;应使用 getVisibleCells()
  • 对同一功能混用 initialState 和 state——state 会覆盖 initialState
  • 将客户端行模型与 manual* 选项混用——如果 manualSorting: true,就不要导入 getSortedRowModel
  • 忘记 getRowId——如果不设置,行 ID 默认使用索引,重新获取数据后会导致选择状态错乱

关键模式

// Controlled sorting state
const [sorting, setSorting] = useState<SortingState>([])
const table = useReactTable({
  data, columns,
  getCoreRowModel: getCoreRowModel(),
  getSortedRowModel: getSortedRowModel(),
  state: { sorting },
  onSortingChange: setSorting,
})
// Header click handler
<th onClick={header.column.getToggleSortingHandler()}>
  {flexRender(header.column.columnDef.header, header.getContext())}
  {{ asc: ' 🔼', desc: ' 🔽' }[header.column.getIsSorted() as string] ?? ''}
</th>

// Server-side pagination
const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10 })
const table = useReactTable({
  data, columns,
  getCoreRowModel: getCoreRowModel(),
  manualPagination: true,
  rowCount: serverData.totalRows,
  state: { pagination },
  onPaginationChange: setPagination,
})

// Row selection with checkbox column
columnHelper.display({
  id: 'select',
  header: ({ table }) => (
    <input type="checkbox" checked={table.getIsAllRowsSelected()}
      onChange={table.getToggleAllRowsSelectedHandler()} />
  ),
  cell: ({ row }) => (
    <input type="checkbox" checked={row.getIsSelected()}
      disabled={!row.getCanSelect()}
      onChange={row.getToggleSelectedHandler()} />
  ),
})

// Column filtering
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])
const table = useReactTable({
  data, columns,
  getCoreRowModel: getCoreRowModel(),
  getFilteredRowModel: getFilteredRowModel(),
  state: { columnFilters },
  onColumnFiltersChange: setColumnFilters,
})
// Filter input
<input value={column.getFilterValue() ?? ''} onChange={e => column.setFilterValue(e.target.value)} />

// Stable row IDs for selection across re-fetches
const table = useReactTable({
  data, columns,
  getRowId: (row) => row.uuid,
  getCoreRowModel: getCoreRowModel(),
})

评论

支持 Markdown