跳至主内容
版本:9.x

SSG 助手

非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

createSSGHelpers 提供了一组辅助函数,可用于在服务器端预取查询。

ts
import { createSSGHelpers } from '@trpc/react/ssg';
const {
prefetchQuery,
prefetchInfiniteQuery,
fetchQuery,
fetchInfiniteQuery,
dehydrate,
queryClient,
} = await createSSGHelpers({
router: appRouter,
ctx: createContext,
transformer: superjson, // optional - adds superjson serialization
});
ts
import { createSSGHelpers } from '@trpc/react/ssg';
const {
prefetchQuery,
prefetchInfiniteQuery,
fetchQuery,
fetchInfiniteQuery,
dehydrate,
queryClient,
} = await createSSGHelpers({
router: appRouter,
ctx: createContext,
transformer: superjson, // optional - adds superjson serialization
});

返回的函数均为 react-query 函数的封装。请查阅相关文档了解更多信息。

Next.js 示例

pages/posts/[id].tsx
ts
import { createSSGHelpers } from '@trpc/react/ssg';
import { GetServerSidePropsContext, InferGetServerSidePropsType } from 'next';
import { createContext, prisma } from 'server/context';
import { appRouter } from 'server/routers/_app';
import superjson from 'superjson';
import { trpc } from 'utils/trpc';
export async function getServerSideProps(
context: GetServerSidePropsContext<{ id: string }>,
) {
const ssg = createSSGHelpers({
router: appRouter,
ctx: await createContext(),
transformer: superjson,
});
const id = context.params?.id as string;
/*
* Prefetching the `post.byId` query here.
* `prefetchQuery` does not return the result - if you need that, use `fetchQuery` instead.
*/
await ssg.prefetchQuery('post.byId', {
id,
});
// Make sure to return { props: { trpcState: ssg.dehydrate() } }
return {
props: {
trpcState: ssg.dehydrate(),
id,
},
};
}
export default function PostViewPage(
props: InferGetServerSidePropsType<typeof getServerSideProps>,
) {
const { id } = props;
// This query will be immediately available as it's prefetched.
const postQuery = trpc.useQuery(['post.byId', { id }]);
const { data } = postQuery;
return (
<>
<h1>{data.title}</h1>
<em>Created {data.createdAt.toLocaleDateString()}</em>
<p>{data.text}</p>
<h2>Raw data:</h2>
<pre>{JSON.stringify(data, null, 4)}</pre>
</>
);
}
pages/posts/[id].tsx
ts
import { createSSGHelpers } from '@trpc/react/ssg';
import { GetServerSidePropsContext, InferGetServerSidePropsType } from 'next';
import { createContext, prisma } from 'server/context';
import { appRouter } from 'server/routers/_app';
import superjson from 'superjson';
import { trpc } from 'utils/trpc';
export async function getServerSideProps(
context: GetServerSidePropsContext<{ id: string }>,
) {
const ssg = createSSGHelpers({
router: appRouter,
ctx: await createContext(),
transformer: superjson,
});
const id = context.params?.id as string;
/*
* Prefetching the `post.byId` query here.
* `prefetchQuery` does not return the result - if you need that, use `fetchQuery` instead.
*/
await ssg.prefetchQuery('post.byId', {
id,
});
// Make sure to return { props: { trpcState: ssg.dehydrate() } }
return {
props: {
trpcState: ssg.dehydrate(),
id,
},
};
}
export default function PostViewPage(
props: InferGetServerSidePropsType<typeof getServerSideProps>,
) {
const { id } = props;
// This query will be immediately available as it's prefetched.
const postQuery = trpc.useQuery(['post.byId', { id }]);
const { data } = postQuery;
return (
<>
<h1>{data.title}</h1>
<em>Created {data.createdAt.toLocaleDateString()}</em>
<p>{data.text}</p>
<h2>Raw data:</h2>
<pre>{JSON.stringify(data, null, 4)}</pre>
</>
);
}