tanstack-router
TanStack Start specialist for file-based routing, SSR, and server functions with React
安装与使用
请根据来源仓库和你的 AI 工具说明安装此技能。先阅读技能文件和依赖要求,再添加到工作流。
查看来源 ↗使用指南技能说明
TanStack Router Specialist
Instructions
When working with TanStack Start:
-
Creating Routes
- Use
createFileRoute()insrc/routes/ - Export a
Routeobject with component - Use
index.tsxfor index routes - Create layout routes without
index.tsx
- Use
-
Server Functions
- Use
createServerFn()for server-side logic - Add validators with Zod schemas
- Specify method: 'POST' for mutations
- Import functions in components
- Use
-
Data Fetching
- Use loaders for fetching data
- Access data with
Route.useLoaderData() - Handle loading and error states
- Use suspense boundaries for async operations
-
Streaming with
<Await>: Don't await slow operations in loader for better UX- Fast operations (e.g., DB queries) can be awaited
- Slow operations (e.g., AI, external APIs) should be returned as promises
- Use
<Suspense>with<Await>in components to stream results
-
SSR Setup
- Ensure root layout in
__root.tsx - Include
HeadContentandScripts - Handle authentication on server
- Pass data via loaders for SSR
- Ensure root layout in
Examples
Creating a basic route:
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/movies')({
component: MoviesPage,
loader: async () => {
const movies = await getMovies()
return { movies }
}
})
function MoviesPage() {
const { movies } = Route.useLoaderData()
return <div>{/* Render movies */}</div>
}
Creating a server function:
import { createServerFn } from '@tanstack/start'
import { z } from 'zod'
export const saveMovie = createServerFn({ method: 'POST' })
.validator(z.object({ movieId: z.number() }))
.handler(async ({ data }) => {
// Server-side logic
await saveToDatabase(data.movieId)
return { success: true }
})
Dynamic routing:
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/movies/$movieId')({
component: MovieDetail,
loader: async ({ params }) => {
const movie = await getMovie(params.movieId)
return { movie }
}
})
Streaming with <Await> for slow operations:
import { createFileRoute } from '@tanstack/react-router'
import { Suspense } from 'react'
import { Await } from '@tanstack/react-router'
export const Route = createFileRoute('/recommendations')({
component: Recommendations,
loader: async () => {
// Fast operation - await it
const userPrefs = await getUserPreferences()
// Slow operation - don't await for streaming
const recommendations = getAIRecommendations({ userPrefs })
return { userPrefs, recommendations }
}
})
function Recommendations() {
const { userPrefs, recommendations } = Route.useLoaderData()
return (
<div>
<h1>Recommendations</h1>
<Suspense fallback={<Skeleton />}>
<Await
promise={recommendations}
children={(data) => <RecommendationList data={data} />}
/>
</Suspense>
</div>
)
}
Consult with: https://tanstack.com/llms.txt for more details
使用示例
查看来源仓库中的使用示例与配置说明。
查看来源 ↗来源历史
- 收录时间
- 2026-01-20
- 索引更新时间
- 2026-01-26
- Branch
- main
收录与同步日期属于本站记录。源码修改历史请查看来源仓库。
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!