rembrembdocs

info

Usage

tip

useSuspenseQuery & useSuspenseInfiniteQuery both return a [data, query]-tuple, to make it easy to directly use your data and renaming the variable to something descriptive

useSuspenseQuery()

tsx

import { trpc } from '../utils/trpc';

function PostView() {

const [post, postQuery] = trpc.post.byId.useSuspenseQuery({ id: '1' });

return <>{/* ... */}</>;

}

useSuspenseInfiniteQuery()

tsx

import { 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 equivalent of useQueries().

tsx

import { trpc } from '../utils/trpc';

const Component = (props: { postIds: string[] }) => {

const [posts, postQueries] = trpc.useSuspenseQueries((t) =>

`props.postIds.map((id) => t.post.byId({ id })),`

);

return <>{/* [...] */}</>;

};

Prefetching

The performance of suspense queries can be improved by prefetching the query data before the Suspense component is rendered (this is sometimes called "render-as-you-fetch").

note

Route-level prefetching

tsx

import { createTRPCQueryUtils } from '@trpc/react-query';

import { createTRPCClient, 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 });

Component-level prefetching with usePrefetchQuery

tsx

import 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>`

);

}

Component-level prefetching with usePrefetchInfiniteQuery

tsx

import 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>`

);

}