Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TanStack DB ~状態管理の新しい考え方~

TanStack DB ~状態管理の新しい考え方~

Avatar for じょうげん

じょうげん

August 22, 2025
Tweet

More Decks by じょうげん

Other Decks in Programming

Transcript

  1. TanStack Query - Server State Management TanStack Router - Type-Safe

    Routing TanStack Table - Headless Table Building TanStack Form - Headless Form Building TanStack DB - Client-Side Database ← NEW! TanStack ファミリー
  2. export const drawCalcCollection = createCollection( localStorageCollectionOptions({ storageKey: "tcg-tool-draw-calculations", id: "draw-calculations",

    getKey: (item) => item.id, schema: drawCalcSchema }), ); Collection という単位でデータの永続化を定義 Zod やValibot などでランタイムバリデーションありの型定義可能 React での使い方の例
  3. const { data } = useLiveQuery((q) => q .from({ calculations:

    calculationsCollection }) .where(({ calculations }) => eq(calculations.id, calculationId)), ); Drizzle のようなSQL ライクなセレクター 型安全なクエリビルダー クエリで絞り込まれた箇所のみの部分的なSubscribe を実現
  4. const CalculationItem = ({ calculationId }: { calculationId: string })

    => { const { data } = useLiveQuery((q) => q.from({ calculations: calculationsCollection }) .where(({ calculations }) => eq(calculations.id, calculationId)), ); const firstCalculation = data[0]; if (!firstCalculation) return <FallbackItem />; return ( <Card.Root> <Card.Header> {firstCalculation.name} </Card.Header> <Card.Body> {firstCalculation.result} </Card.Body> </Card.Root> ); } コンポーネントで使う
  5. // 条件をあらかじめ指定 export const drawCalcHistoryCollection = createLiveQueryCollection((q) => q.from({ calculations:

    drawCalcCollection }) .orderBy(({ calculations }) => calculations.updatedAt, "desc"), ); // 引数ありの動的なCollection export const createDrawCalcByGameCollection = (gameTemplate: string) => createLiveQueryCollection((q) => q.from({ calculations: drawCalcCollection }) .where(({ calculations }) => eq(calculations.gameTemplate, gameTemplate)) .orderBy(({ calculations }) => calculations.updatedAt, "desc"), ); 派生Collection も可能
  6. localStorage インメモリ REST API Electric SQL TrailBase Supabase, IndexedDB, DuckDB

    Wasm などもAdapter を用意することで利用可能になる かも 永続化層を 自由に差し替え可能
  7. Zustand / Jotai のような状態を → SQL ライクなクエリ + スキーマ に置き換え可能

    単なる状態管理にとどまらず、データの保管にも利用できる 認知負荷を大幅に削減 できるかも! 状態管理のベストプラクティスを変える?