Suspense
Traduction Bêta Non Officielle
Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →
info
- Assurez-vous d'utiliser la dernière version de React
- Si vous utilisez Suspense avec le SSR automatique de tRPC dans Next.js, la page entière plantera côté serveur en cas d'échec de requête, même avec un
<ErrorBoundary />
Utilisation
astuce
useSuspenseQuery et useSuspenseInfiniteQuery retournent toutes deux un [data, query]-tuple, facilitant l'utilisation directe des données et le renommage descriptif des variables
useSuspenseQuery()
tsx// @filename: pages/index.tsximportReact from 'react';import {trpc } from '../utils/trpc';functionPostView () {const [post ,postQuery ] =trpc .post .byId .useSuspenseQuery ({id : '1' });return <>{/* ... */}</>;}
tsx// @filename: pages/index.tsximportReact from 'react';import {trpc } from '../utils/trpc';functionPostView () {const [post ,postQuery ] =trpc .post .byId .useSuspenseQuery ({id : '1' });return <>{/* ... */}</>;}
useSuspenseInfiniteQuery()
tsx// @filename: pages/index.tsximport React from 'react';import { trpc } from '../utils/trpc';function PostView() {const [{ pages }, allPostsQuery] = trpc.post.all.useSuspenseInfiniteQuery({},{getNextPageParam(lastPage) {return lastPage.nextCursor;},},);const { isFetching, isFetchingNextPage, fetchNextPage, hasNextPage } =allPostsQuery;return <>{/* ... */}</>;}
tsx// @filename: pages/index.tsximport React from 'react';import { trpc } from '../utils/trpc';function PostView() {const [{ pages }, allPostsQuery] = trpc.post.all.useSuspenseInfiniteQuery({},{getNextPageParam(lastPage) {return lastPage.nextCursor;},},);const { isFetching, isFetchingNextPage, fetchNextPage, hasNextPage } =allPostsQuery;return <>{/* ... */}</>;}
useSuspenseQueries()
Équivalent Suspense de useQueries().
tsxconst Component = (props: { postIds: string[] }) => {const [posts, postQueries] = trpc.useSuspenseQueries((t) =>props.postIds.map((id) => t.post.byId({ id })),);return <>{/* [...] */}</>;};
tsxconst Component = (props: { postIds: string[] }) => {const [posts, postQueries] = trpc.useSuspenseQueries((t) =>props.postIds.map((id) => t.post.byId({ id })),);return <>{/* [...] */}</>;};
Préchargement
Les performances des requêtes Suspense peuvent être améliorées en préchargeant les données avant le rendu du composant Suspense (approche parfois appelée "render-as-you-fetch").
note
- Le préchargement et le modèle "render-as-you-fetch" dépendent fortement de votre framework et routeur. Consultez la documentation de votre routeur et celle de @tanstack/react-query pour implémenter ces patterns.
- Avec Next.js, référez-vous à la documentation des Server-Side Helpers pour le préchargement côté serveur.
Préchargement au niveau des routes
tsxconst utils = createTRPCQueryUtils({ queryClient, client: trpcClient });// tanstack router/ react router loaderconst loader = async (params: { id: string }) =>utils.post.byId.ensureQueryData({ id: params.id });
tsxconst utils = createTRPCQueryUtils({ queryClient, client: trpcClient });// tanstack router/ react router loaderconst loader = async (params: { id: string }) =>utils.post.byId.ensureQueryData({ id: params.id });
Préchargement au niveau des composants avec usePrefetchQuery
tsximport { trpc } from '../utils/trpc';function PostViewPage(props: { postId: string }) {trpc.post.byId.usePrefetchQuery({ id: props.postId });return (<Suspense><PostView postId={props.postId} /></Suspense>);}
tsximport { trpc } from '../utils/trpc';function PostViewPage(props: { postId: string }) {trpc.post.byId.usePrefetchQuery({ id: props.postId });return (<Suspense><PostView postId={props.postId} /></Suspense>);}
Préchargement au niveau des composants avec usePrefetchInfiniteQuery
tsximport { trpc } from '../utils/trpc';// will have to be passed to the child PostView `useSuspenseInfiniteQuery`export const getNextPageParam = (lastPage) => lastPage.nextCursor;function PostViewPage(props: { postId: string }) {trpc.post.all.usePrefetchInfiniteQuery({}, { getNextPageParam });return (<Suspense><PostView postId={props.postId} /></Suspense>);}
tsximport { trpc } from '../utils/trpc';// will have to be passed to the child PostView `useSuspenseInfiniteQuery`export const getNextPageParam = (lastPage) => lastPage.nextCursor;function PostViewPage(props: { postId: string }) {trpc.post.all.usePrefetchInfiniteQuery({}, { getNextPageParam });return (<Suspense><PostView postId={props.postId} /></Suspense>);}