Suspense
Inofficiell Beta-översättning
Denna sida har översatts av PageTurner AI (beta). Inte officiellt godkänd av projektet. Hittade du ett fel? Rapportera problem →
information
- Se till att du använder den senaste versionen av React
- Om du använder suspense med tRPC:s automatiska SSR i Next.js kommer hela sidan att krascha på servern om en query misslyckas, även om du har en
<ErrorBoundary />
Användning
tips
useSuspenseQuery & useSuspenseInfiniteQuery returnerar båda en [data, query]-tupel, vilket gör det enkelt att direkt använda dina data och döpa om variabeln till något beskrivande
useSuspenseQuery()
tsximport { trpc } from '../utils/trpc';function PostView() {const [post, postQuery] = trpc.post.byId.useSuspenseQuery({ id: '1' });return <>{/* ... */}</>;}
tsximport { trpc } from '../utils/trpc';function PostView() {const [post, postQuery] = trpc.post.byId.useSuspenseQuery({ id: '1' });return <>{/* ... */}</>;}
useSuspenseInfiniteQuery()
tsximport { trpc } from '../utils/trpc';import type { PostPage }from '../server'; function PostView() { const [{ pages }, allPostsQuery] = trpc.post.all.useSuspenseInfiniteQuery({},{getNextPageParam(lastPage: PostPage) {return lastPage.nextCursor; },initialCursor: '',},);const { isFetching, isFetchingNextPage, fetchNextPage, hasNextPage } =allPostsQuery;return <>{/* ... */}</>;}
tsximport { trpc } from '../utils/trpc';import type { PostPage }from '../server'; function PostView() { const [{ pages }, allPostsQuery] = trpc.post.all.useSuspenseInfiniteQuery({},{getNextPageParam(lastPage: PostPage) {return lastPage.nextCursor; },initialCursor: '',},);const { isFetching, isFetchingNextPage, fetchNextPage, hasNextPage } =allPostsQuery;return <>{/* ... */}</>;}
useSuspenseQueries()
Suspense-ekvivalent för useQueries().
tsximport { trpc } from '../utils/trpc';const Component = (props: { postIds: string[] }) => {const [posts, postQueries] = trpc.useSuspenseQue ries((t) =>props.postIds.map((id) => t.post.byId({ id })),);return <>{/* [...] */}</>;};
tsximport { trpc } from '../utils/trpc';const Component = (props: { postIds: string[] }) => {const [posts, postQueries] = trpc.useSuspenseQue ries((t) =>props.postIds.map((id) => t.post.byId({ id })),);return <>{/* [...] */}</>;};
Prefetching
Prestandan för suspense-queries kan förbättras genom att förhämta query-datan innan Suspense-komponenten renderas (kallas ibland "render-as-you-fetch").
notering
- Prefetching och render-as-you-fetch-modellen är starkt beroende av vilket ramverk och router du använder. Vi rekommenderar att läsa din ramverks routerdokumentation tillsammans med @tanstack/react-query-dokumentationen för att förstå hur dessa mönster implementeras.
- Om du använder Next.js, se dokumentationen om Server-Side Helpers för att implementera server-side prefetching.
Prefetching på ruttnivå
tsximport {createTRPCQuery Utils } from '@trpc/react-query';import {createTRP CClient, httpBatchLink } from '@trpc/client';import { QueryClient } from '@tanstack/react-query';import type{ AppRouter } from './server'; const queryClient = new QueryClient();const trpcClient = createTRPCClient<AppRouter>({ links: [httpBatchLink({ url: 'http://localhost:3000' })] });const utils = createTRPCQueryUtils({ queryClient, client: trpcClient });// tanstack router/ react router loader const loader = async (params: { id: string }) =>utils.post.byId.ensureData({ id: params.id });
tsximport {createTRPCQuery Utils } from '@trpc/react-query';import {createTRP CClient, httpBatchLink } from '@trpc/client';import { QueryClient } from '@tanstack/react-query';import type{ AppRouter } from './server'; const queryClient = new QueryClient();const trpcClient = createTRPCClient<AppRouter>({ links: [httpBatchLink({ url: 'http://localhost:3000' })] });const utils = createTRPCQueryUtils({ queryClient, client: trpcClient });// tanstack router/ react router loader const loader = async (params: { id: string }) =>utils.post.byId.ensureData({ id: params.id });
Prefetching på komponentnivå med usePrefetchQuery
tsximport React, { Suspense } from 'react';import { trpc } from '../utils/trpc';function PostView(props: { postId: string }) { return <></>;}function PostViewPage(props: { postId: string }) {trpc.post.byId.usePrefetchQuery({ id: props.postId });return (<Suspense><PostView postId={props.postId} /></Suspense>);}
tsximport React, { Suspense } from 'react';import { trpc } from '../utils/trpc';function PostView(props: { postId: string }) { return <></>;}function PostViewPage(props: { postId: string }) {trpc.post.byId.usePrefetchQuery({ id: props.postId }); return (<Suspense><PostView postId={props.postId} /></Suspense>);}
Prefetching på komponentnivå med usePrefetchInfiniteQuery
tsximport React, { Suspense } from 'react';import { trpc } from '../utils/trpc';import type { PostPage } from '../server';function PostView(props: { postId: string }) {return <></>;}function PostViewPage(props: { postId: string }) { trpc.post.all.usePrefetchInfiniteQuery({},{getNextPageParam(lastPage: PostPage) {return lastPage.nextCursor;},initialCursor: '',},);return (<Suspense><PostView postId={props.postId} /></Suspense>);}
tsximport React, { Suspense } from 'react';import { trpc } from '../utils/trpc';import type { PostPage } from '../server';function PostView(props: { postId: string }) {return <></>;}function PostViewPage(props: { postId: string }) { trpc.post.all.usePrefetchInfiniteQuery({},{getNextPageParam(lastPage: PostPage) {return lastPage.nextCursor;},initialCur sor: '',},);return (<Suspense><PostView postId={props.postId} /></Suspense>);}