| name | data-fetching |
| description | Data fetching and caching patterns. Use when fetching data, implementing caching strategies, or organizing queries. |
| user-invocable | false |
Data Fetching Patterns
Server Component Fetching
export default async function Page() {
const data = await fetchData()
return <Component data={data} />
}
Suspense Streaming
Each Suspense boundary streams independently:
export default async function Page() {
return (
<>
<Suspense fallback={<VignetteSkeleton />}>
<VignetteSection />
</Suspense>
<Suspense fallback={<ProgressSkeleton />}>
<ProgressTracker />
</Suspense>
</>
)
}
async function VignetteSection() {
const vignettes = await getAssignedVignettes(sessionId)
return <VignetteList data={vignettes} />
}
Query Organization
lib/queries/
āāā applicants.ts
āāā assessment.ts
āāā vignettes.ts
āāā personality.ts
import { createClient } from "@/lib/supabase/server"
export async function getAssignedVignettes(sessionId: string) {
const supabase = await createClient()
const { data } = await supabase
.from("assessment_sessions")
.select("*, pi_vignettes(*), ci_vignettes(*)")
.eq("id", sessionId)
.single()
return data
}
Parallel Data Fetching
export default async function Page({ params }) {
const [session, vignettes, personality] = await Promise.all([
getSession(params.id),
getVignettes(params.id),
getPersonalityItems(),
])
return <Assessment session={session} vignettes={vignettes} personality={personality} />
}
Anti-patterns
"use client"
useEffect(() => { fetch(...).then(setData) }, [])
export default async function Page() {
const data = await fetch(...)
return <Component data={data} />
}