useInfiniteQuery
資訊
- 您的程序需要接受任何型別(
字串
、數字
等)的cursor
輸入才能公開此掛勾。 - 有關無限查詢的更多詳細資訊,請閱讀 react-query 文件
- 在此範例中,我們使用 Prisma - 請參閱其 基於游標的分頁 文件
範例程序
server/routers/_app.tstsx
import { initTRPC } from '@trpc/server';import { z } from 'zod';import { Context } from './[trpc]';export const t = initTRPC.create();export const appRouter = t.router({infinitePosts: t.procedure.input(z.object({limit: z.number().min(1).max(100).nullish(),cursor: z.number().nullish(), // <-- "cursor" needs to exist, but can be any typedirection: z.enum(['forward', 'backward']), // optional, useful for bi-directional query}),).query(async (opts) => {const { input } = opts;const limit = input.limit ?? 50;const { cursor } = input;const items = await prisma.post.findMany({take: limit + 1, // get an extra item at the end which we'll use as next cursorwhere: {title: {contains: 'Prisma' /* Optional filter */,},},cursor: cursor ? { myCursor: cursor } : undefined,orderBy: {myCursor: 'asc',},});let nextCursor: typeof cursor | undefined = undefined;if (items.length > limit) {const nextItem = items.pop();nextCursor = nextItem!.myCursor;}return {items,nextCursor,};}),});
server/routers/_app.tstsx
import { initTRPC } from '@trpc/server';import { z } from 'zod';import { Context } from './[trpc]';export const t = initTRPC.create();export const appRouter = t.router({infinitePosts: t.procedure.input(z.object({limit: z.number().min(1).max(100).nullish(),cursor: z.number().nullish(), // <-- "cursor" needs to exist, but can be any typedirection: z.enum(['forward', 'backward']), // optional, useful for bi-directional query}),).query(async (opts) => {const { input } = opts;const limit = input.limit ?? 50;const { cursor } = input;const items = await prisma.post.findMany({take: limit + 1, // get an extra item at the end which we'll use as next cursorwhere: {title: {contains: 'Prisma' /* Optional filter */,},},cursor: cursor ? { myCursor: cursor } : undefined,orderBy: {myCursor: 'asc',},});let nextCursor: typeof cursor | undefined = undefined;if (items.length > limit) {const nextItem = items.pop();nextCursor = nextItem!.myCursor;}return {items,nextCursor,};}),});
範例 React 元件
components/MyComponent.tsxtsx
import { trpc } from '../utils/trpc';export function MyComponent() {const myQuery = trpc.infinitePosts.useInfiniteQuery({limit: 10,},{getNextPageParam: (lastPage) => lastPage.nextCursor,// initialCursor: 1, // <-- optional you can pass an initialCursor},);// [...]}
components/MyComponent.tsxtsx
import { trpc } from '../utils/trpc';export function MyComponent() {const myQuery = trpc.infinitePosts.useInfiniteQuery({limit: 10,},{getNextPageParam: (lastPage) => lastPage.nextCursor,// initialCursor: 1, // <-- optional you can pass an initialCursor},);// [...]}
幫手
getInfiniteData()
此幫手從現有的無限查詢中取得目前快取的資料
components/MyComponent.tsxtsx
import { trpc } from '../utils/trpc';export function MyComponent() {const utils = trpc.useUtils();const myMutation = trpc.infinitePosts.add.useMutation({async onMutate(opts) {await utils.infinitePosts.cancel();const allPosts = utils.infinitePosts.getInfiniteData({ limit: 10 });// [...]},});}
components/MyComponent.tsxtsx
import { trpc } from '../utils/trpc';export function MyComponent() {const utils = trpc.useUtils();const myMutation = trpc.infinitePosts.add.useMutation({async onMutate(opts) {await utils.infinitePosts.cancel();const allPosts = utils.infinitePosts.getInfiniteData({ limit: 10 });// [...]},});}
setInfiniteData()
此幫手允許你更新查詢的快取資料
components/MyComponent.tsxtsx
import { trpc } from '../utils/trpc';export function MyComponent() {const utils = trpc.useUtils();const myMutation = trpc.infinitePosts.delete.useMutation({async onMutate(opts) {await utils.infinitePosts.cancel();utils.infinitePosts.setInfiniteData({ limit: 10 }, (data) => {if (!data) {return {pages: [],pageParams: [],};}return {...data,pages: data.pages.map((page) => ({...page,items: page.items.filter((item) => item.status === 'published'),})),};});},});// [...]}
components/MyComponent.tsxtsx
import { trpc } from '../utils/trpc';export function MyComponent() {const utils = trpc.useUtils();const myMutation = trpc.infinitePosts.delete.useMutation({async onMutate(opts) {await utils.infinitePosts.cancel();utils.infinitePosts.setInfiniteData({ limit: 10 }, (data) => {if (!data) {return {pages: [],pageParams: [],};}return {...data,pages: data.pages.map((page) => ({...page,items: page.items.filter((item) => item.status === 'published'),})),};});},});// [...]}