You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs: Update Streaming with Server Components docs to reflect correct usage (#7725)
* chore: update Streaming with Server Components docs to reflect correct usage
* chore: update Streaming with Server Components to show moving the getQueryClient function
* chore: fix prettier styling
---------
Co-authored-by: Dominik Dorfmeister <office@dorfmeister.cc>
Copy file name to clipboardexpand all lines: docs/framework/react/guides/advanced-ssr.md
+25-5
Original file line number
Diff line number
Diff line change
@@ -365,7 +365,9 @@ With the prefetching patterns described above, React Query is perfectly compatib
365
365
366
366
As of React Query v5.40.0, you don't have to `await` all prefetches for this to work, as `pending` Queries can also be dehydrated and sent to the client. This lets you kick off prefetches as early as possible without letting them block an entire Suspense boundary, and streams the _data_ to the client as the query finishes. This can be useful for example if you want to prefetch some content that is only visible after some user interaction, or say if you want to `await` and render the first page of an infinite query, but start prefetching page 2 without blocking rendering.
367
367
368
-
To make this work, we have to instruct the `queryClient` to also `dehydrate` pending Queries. We can do this globally, or by passing that option directly to `hydrate`:
368
+
To make this work, we have to instruct the `queryClient` to also `dehydrate` pending Queries. We can do this globally, or by passing that option directly to `hydrate`.
369
+
370
+
We will also need to move the `getQueryClient()` function out of our `app/providers.jsx` file as we want to use it in our server component and our client provider.
369
371
370
372
```tsx
371
373
// app/get-query-client.ts
@@ -378,15 +380,30 @@ function makeQueryClient() {
378
380
staleTime: 60*1000,
379
381
},
380
382
dehydrate: {
381
-
// per default, only successful Queries are included,
382
-
// this includes pending Queries as well
383
+
// include pending queries in dehydration
383
384
shouldDehydrateQuery: (query) =>
384
385
defaultShouldDehydrateQuery(query) ||
385
386
query.state.status==='pending',
386
387
},
387
388
},
388
389
})
389
390
}
391
+
392
+
let browserQueryClient:QueryClient|undefined=undefined
393
+
394
+
exportfunction getQueryClient() {
395
+
if (isServer) {
396
+
// Server: always make a new query client
397
+
returnmakeQueryClient()
398
+
} else {
399
+
// Browser: make a new query client if we don't already have one
400
+
// This is very important, so we don't re-make a new client if React
401
+
// suspends during the initial render. This may not be needed if we
402
+
// have a suspense boundary BELOW the creation of the query client
403
+
if (!browserQueryClient) browserQueryClient=makeQueryClient()
404
+
returnbrowserQueryClient
405
+
}
406
+
}
390
407
```
391
408
392
409
> Note: This works in NextJs and Server Components because React can serialize Promises over the wire when you pass them down to Client Components.
@@ -439,7 +456,7 @@ If you're using non-JSON data types and serialize the query results on the serve
0 commit comments