TanStack Full Demo
March 17, 2026 ยท View on GitHub
A beginner-friendly dashboard showcasing all major TanStack libraries working together in a real app.
๐ Live Demo: https://example-react-brown.vercel.app
TanStack Libraries Used
| Library | Version | Usage |
|---|---|---|
@tanstack/react-router | ^1.167.4 | File-based routing, type-safe navigation, SSR |
@tanstack/react-query | ^5.90.21 | Data fetching, caching, useQuery + useMutation |
@tanstack/react-table | ^8.21.3 | Headless table โ sort, filter, pagination |
@tanstack/react-virtual | ^3.13.23 | Virtualized list for large datasets |
@tanstack/react-form | ^1.28.5 | Form state management with validation |
@tanstack/react-store | ^0.9.2 | Global UI state (tab, view mode, search) |
@tanstack/react-start | ^1.166.15 | Full-stack React framework (SSR) |
Pages
๐ฃ /todos โ Query + Form + Store
useQueryto fetch todos with automatic cachinguseMutationfor add / toggle / delete with optimistic updates (UI updates instantly, reverts on error)useFormwith field-level validation (required field)@tanstack/storefor global search state shared across components
๐ต /posts โ Query + Table + Virtual
useQueryfetches all 100 posts once, cached for 10 minutesuseReactTablewith sorting (click headers), global filter, and pagination- Toggle to Virtual List mode โ
useVirtualizerrenders only visible rows in DOM (~5-10 rows), not all 100
๐ข /users โ Query + Table + Form
- Sortable, filterable table of 10 users
- Click โ๏ธ to open edit dialog
useForminside dialog with per-field validationuseMutationpatches user with optimistic update
Key Concepts Demonstrated
- Optimistic Updates โ UI reflects changes immediately without waiting for API
- Cache Invalidation โ mutations cancel in-flight queries and update cache directly
- SSR-safe hooks โ
useStorewith explicit selectors,QueryClientcreated per-request on server - Virtualization โ 100 rows in DOM = ~10 elements vs 100 with normal rendering
- Headless UI โ TanStack Table/Form/Virtual are logic-only, you own the markup
Tech Stack
- TanStack Start (
@tanstack/react-start) โ SSR framework - Vite + Nitro โ bundler & server (Vercel preset)
- shadcn/ui โ Radix UI + CVA components (Button, Card, Input, Badge, Dialog, Checkbox...)
- Tailwind CSS v4 โ utility-first styling with
@themeCSS variables - Lucide React โ icons
- JSONPlaceholder โ free fake REST API (todos, posts, users)
- TypeScript throughout
Project Structure
src/
โโโ components/
โ โโโ ui/ # shadcn/ui components
โ โโโ button.tsx
โ โโโ card.tsx
โ โโโ input.tsx
โ โโโ badge.tsx
โ โโโ checkbox.tsx
โ โโโ dialog.tsx
โ โโโ label.tsx
โ โโโ select.tsx
โ โโโ separator.tsx
โโโ lib/
โ โโโ utils.ts # cn() helper (clsx + tailwind-merge)
โโโ store/
โ โโโ index.ts # @tanstack/store global state
โโโ routes/
โ โโโ __root.tsx # Root layout (QueryClientProvider, Header, Outlet)
โ โโโ index.tsx # Home dashboard
โ โโโ todos.tsx # Query + Form + Store demo
โ โโโ posts.tsx # Table + Virtual demo
โ โโโ users.tsx # Table + Form + Mutation demo
โโโ styles/
โ โโโ app.css # Tailwind v4 + shadcn CSS variables
โโโ router.tsx # createRouter config
โโโ routeTree.gen.ts # Route tree (manually maintained)
Getting Started
git clone https://github.com/truongnat/example-react
cd example-react
npm install
npm run dev
Deploy
Pre-configured for Vercel โ just connect the repo on vercel.com, no extra settings needed.
Uses Nitro vercel preset which outputs to .vercel/output/ format automatically.
Note: JSONPlaceholder is a read-only fake API. Mutations (add/edit/delete) return correct responses but data resets on page reload.