Suspense
非公式ベータ版翻訳
このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →
情報
- Reactの最新バージョンを使用していることを確認してください
- Next.jsでのtRPCの自動SSRとSuspenseを併用する場合、クエリが失敗するとサーバー上でページ全体がクラッシュします(
<ErrorBoundary />を設置している場合でも)
使用方法
ヒント
useSuspenseQueryとuseSuspenseInfiniteQueryはどちらも[data, query]というタプルを返すため、データを直接使用したり、変数にわかりやすい名前を付けたりするのが簡単になります
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()
useQueries()のSuspense対応版です。
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 <>{/* [...] */}</>;};
プリフェッチ
Suspenseクエリのパフォーマンスは、Suspenseコンポーネントがレンダリングされる前にクエリデータをプリフェッチすることで向上させられます(これは"render-as-you-fetch"と呼ばれることもあります)。
注記
- プリフェッチとrender-as-you-fetchモデルは、使用しているフレームワークやルーターに大きく依存します。これらのパターンを実装するには、お使いのフレームワークのルーター文書と@tanstack/react-queryのドキュメントを併せて読むことを推奨します
- Next.jsを使用している場合は、サーバーサイドプリフェッチを実装するためにServer-Side Helpersのドキュメントを参照してください
ルートレベルのプリフェッチ
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 });
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>);}
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>);}