tanstack-vue-table-skilld について
@tanstack/vue-table v9 で Vue 3 のテーブルを構築する開発者向けのパッケージスキルです。設定、リアクティブな状態管理、移行、TanStack 製品との連携方法を扱います。
主な機能
- 01useTable による Vue 3 テーブル設定
- 02機能と行モデルの明示的な登録
- 03アトムベースのリアクティブな状態管理
- 04v8 から v9 への移行ガイド
- 05TanStack Query と Virtual の連携パターン
活用シーン
- 01v9 API を使った Vue 3 テーブルの作成
- 02ソートやページネーション機能の追加
- 03テーブル状態のリアクティブな管理
- 04テーブルの v8 から v9 への移行
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ skilld-dev/ vue-ecosystem-skills --skill tanstack-vue-table-skilldインストール後、Claude Code で/tanstack-vue-table-skilldを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/api.mdintegrations.mdmigration-v8-to-v9.md詳細
@tanstack/vue-table 9.2.4
Vue 3 向けのヘッドレステーブルアダプターです。@tanstack/table-core 9.2.4 のすべてに加え、Vue バインディングの useTable、FlexRender、flexRender、createTableHook を再エクスポートします(dist/index.d.ts:4-5)。
環境の制限:ピア依存関係として vue >=3.2、Node >=20、実行時依存関係として @tanstack/store ^0.11.1 が必要です(package.json:34-53)。
この Skill は v9 のみを対象としています。useVueTable、getCoreRowModel()、または onStateChange を使うコードは v8 向けです。まず v8 から v9 への移行を行ってください。
クイックスタート
<script setup lang="ts">
import { ref } from 'vue'
import { FlexRender, tableFeatures, useTable } from '@tanstack/vue-table'
type Person = { name: string; age: number }
const features = tableFeatures({})
const columns = [
{ accessorKey: 'name', header: 'Name' },
{ accessorKey: 'age', header: 'Age' },
]
const data = ref<Person[]>([{ name: 'Ada', age: 36 }])
const table = useTable({ features, columns, data })
</script>
<template>
<table>
<thead>
<tr v-for="group in table.getHeaderGroups()" :key="group.id">
<th v-for="header in group.headers" :key="header.id">
<FlexRender v-if="!header.isPlaceholder" :header="header" />
</th>
</tr>
</thead>
<tbody>
<tr v-for="row in table.getRowModel().rows" :key="row.id">
<td v-for="cell in row.getAllCells()" :key="cell.id">
<FlexRender :cell="cell" />
</td>
</tr>
</tbody>
</table>
</template>
ソース:パッケージに同梱されている skills/getting-started/SKILL.md。
機能を明示的に追加する
コア以外の機能はすべて登録する必要があります。また、各行モデルのスロットは、同じ tableFeatures 呼び出し内で前提となる機能の後に指定してください。コア行モデルは自動で追加されるため、getCoreRowModel() オプションはありません。
import {
createSortedRowModel,
rowSortingFeature,
sortFn_alphanumeric,
tableFeatures,
} from '@tanstack/vue-table'
const features = tableFeatures({
rowSortingFeature,
sortedRowModel: createSortedRowModel(),
sortFns: { alphanumeric: sortFn_alphanumeric },
})
API は機能の登録状況によって異なります。table.atoms.pagination がない場合、rowPaginationFeature は登録されていません。機能とスロットの一覧は、API の概要を参照してください。
スライスごとに状態の管理元を一つにする
状態はアトムベースです。追跡される境界(テンプレート、computed、watch、または table.Subscribe)内で読み取ってください。単独での読み取りはスナップショットにすぎません。
const pageIndex = computed(() => table.atoms.pagination.get().pageIndex)
制御するスライスには、リアクティブな state と、値または関数形式のアップデーターを処理する対応する on[State]Change コールバックが必要です。
const pagination = ref<PaginationState>({ pageIndex: 0, pageSize: 20 })
const state = computed(() => ({ pagination: pagination.value }))
const onPaginationChange = (next: PaginationState | ((old: PaginationState) => PaginationState)) => {
pagination.value = typeof next === 'function' ? next(pagination.value) : next
}
// pass state and onPaginationChange to useTable
各スライスの管理元は、内部のデフォルト値、initialState、外部の atoms、または state + コールバックのいずれか一つだけにしてください。atoms.pagination と state.pagination を併用しないでください。onStateChange は廃止されました。代わりに table.store を監視してください。詳細はAPI の概要を参照してください。
ほとんどのバグを防ぐルール
dataにはref/computedを渡し、data.valueは渡さないでください(dist/useTable.d.ts:13-19)。配列を置き換えて更新してください(.value = [...])。書き込み可能なアトムはshallowRefを使うため(dist/reactivity.js:50-52)、インプレースのpush/spliceは追跡されません。featuresとcolumnsは安定した状態に保ち、レンダーごとに配列を再構築しないでください。FlexRenderの省略記法:cell、:header、:footerを使ってレンダリングしてください。従来の:render/:props形式も引き続きコンパイルできますが、これは移行対象であり、標準の形式ではありません(dist/FlexRender.d.ts:28-41)。- 行、セル、列、ヘッダーのメソッドを分割代入したり、スプレッド構文で展開したりしないでください。これらは
thisを使うプロトタイプメソッドです。const read = row.getValueではなく、row.getValue('name')を使ってください。 - JSX では、レンダー関数を明示的な
childrenプロパティとしてtable.Subscribeに渡してください。Vue の JSX では子要素がスロットになります(dist/useTable.d.ts:9-11)。 - サーバー駆動のテーブルでは、
manualPagination: trueのようにmanual*オプションを設定し、rowCountを渡してください。 stockFeaturesを指定するとすべての機能が追加されます。一時的な監査用の橋渡しとしてのみ使用し、本番では使用しないでください。
よくある間違い
- HIGH:
getSortedRowModelオプションを残したままuseVueTableをuseTableに名前変更する。行モデルとレジストリをtableFeaturesに移してください(skills/migrate-v8-to-v9/SKILL.md:156-159)。 - HIGH:
useTable({ data: data.value })は単一のスナップショットを固定します。dataを渡してください(skills/getting-started/SKILL.md:85-99)。 - HIGH:追跡される境界の外で
table.atoms.sorting.get()を読み取る。computedで囲んでください(skills/table-state/SKILL.md:104-116)。 - HIGH:アップデーター関数を処理せず、
pagination.value = nextのようにそのまま代入する(skills/table-state/SKILL.md:146-161)。 - HIGH:
columnPinning.left/rightは廃止されました。v9 ではstart/endによる論理的なピン留めを使います(skills/migrate-v8-to-v9/SKILL.md:99-120)。 - HIGH:
createColumnHelper<Person>()は、先に機能を指定する必要があります。createColumnHelper<typeof features, Person>()を使ってください(skills/migrate-v8-to-v9/SKILL.md:147-148)。
再利用可能なアプリの規約
アプリ全体に適用するテーブルのデフォルト設定には、createTableHook({ features, tableComponents, cellComponents, headerComponents }) を使って、useAppTable、createAppColumnHelper、型付きコンテキストフック(dist/createTableHook.d.ts:136-153)を取得します。登録済みコンポーネントがフックモジュールをインポートするときに循環推論が発生しないよう、コンテキストフックは明示的な型を指定してエクスポートしてください(skills/create-table-hook/SKILL.md:62-84)。
インテグレーション
- TanStack Query:リアクティブなキー、
rowCount、計算済みデータの受け渡しを使った手動ページネーション。インテグレーション - TanStack Virtual:
table.getRowModel().rowsを仮想化し、ソース配列は仮想化しないでください。インテグレーション
参考資料
- API の概要:エクスポート、サブパス、
useTable/Subscribeの型、機能とスロット、アトムモデル。 - v8 から v9 への移行:破壊的変更の全一覧、ピン留め関連の名称変更、TypeScript の変更、チェックリスト。
- インテグレーション:TanStack Query と TanStack Virtual の組み合わせパターン。
パッケージに含まれるその他の内容
パッケージには独自のエージェントスキル(getting-started、table-state、migrate-v8-to-v9、create-table-hook、with-tanstack-query、with-tanstack-virtual)が skills/ に含まれており、コーディングエージェントに組み込むための npx @tanstack/intent@latest install が記載されています(README.md:70-78)。正確な API はインストール済みの node_modules/@tanstack/vue-table/dist/index.d.ts で確認してください。v8 の記憶をもとに v9 を再構成しないでください。