Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,21 +44,22 @@ That works. But you just adopted a server-first architecture to render _one serv
The inverse approach is much simpler. Keep the dashboard client-owned. Ask the server for a rendered chart fragment. Drop it into the tree wherever you want, alongside whatever client state you already have. If the chart has no interactive client regions, you don't even ship a client chunk for it.

```tsx
import { CompositeComponent } from '@tanstack/react-start/rsc'
import { createFromReadableStream } from '@tanstack/react-start/rsc'

function Dashboard() {
const { data } = useSuspenseQuery({
const { data: chart } = useSuspenseQuery({
queryKey: ['analytics-chart', range],
queryFn: () => getAnalyticsChart({ data: { range } }),
queryFn: async () =>
createFromReadableStream(await getAnalyticsChart({ data: { range } })),
})

return (
<DashboardShell>
<Filters />
<Tabs>
<Tab label="Overview">
{/* Server-rendered, dropped into a client-owned tree */}
<CompositeComponent src={data.src} />
{/* Server-rendered output, dropped into a client-owned tree */}
{chart}
</Tab>
<Tab label="Raw">
<ClientOnlyTable />
Expand Down
Loading