Hook useInfiniteQuery()
Traduction Bêta Non Officielle
Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →
info
- Votre procédure doit accepter une entrée
cursorde n'importe quel type (string,number, etc.) pour exposer ce hook. - Pour plus de détails sur les requêtes infinies, consultez la documentation react-query
- Dans cet exemple nous utilisons Prisma - voir leur documentation sur la pagination par curseur
Exemple de procédure
server/routers/_app.tstsximport {initTRPC } from '@trpc/server';import {z } from 'zod';export constt =initTRPC .create ();export constappRouter =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 ;constlimit =input .limit ?? 50;const {cursor } =input ;constitems = awaitprisma .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',},});letnextCursor : typeofcursor | undefined =undefined ;if (items .length >limit ) {constnextItem =items .pop ();nextCursor =nextItem !.myCursor ;}return {items ,nextCursor ,};}),});
server/routers/_app.tstsximport {initTRPC } from '@trpc/server';import {z } from 'zod';export constt =initTRPC .create ();export constappRouter =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 ;constlimit =input .limit ?? 50;const {cursor } =input ;constitems = awaitprisma .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',},});letnextCursor : typeofcursor | undefined =undefined ;if (items .length >limit ) {constnextItem =items .pop ();nextCursor =nextItem !.myCursor ;}return {items ,nextCursor ,};}),});
Exemple de composant React
components/MyComponent.tsxtsximport {trpc } from '../utils/trpc';export functionMyComponent () {constmyQuery =trpc .infinitePosts .useInfiniteQuery ({limit : 10,},{getNextPageParam : (lastPage ) =>lastPage .nextCursor ,// initialCursor: 1, // <-- optional you can pass an initialCursor},);// [...]}
components/MyComponent.tsxtsximport {trpc } from '../utils/trpc';export functionMyComponent () {constmyQuery =trpc .infinitePosts .useInfiniteQuery ({limit : 10,},{getNextPageParam : (lastPage ) =>lastPage .nextCursor ,// initialCursor: 1, // <-- optional you can pass an initialCursor},);// [...]}
Assistants
getInfiniteData()
Cet utilitaire récupère les données actuellement en cache d'une requête infinie existante
components/MyComponent.tsxtsximport {trpc } from '../utils/trpc';export functionMyComponent () {constutils =trpc .useUtils ();constmyMutation =trpc .infinitePosts .add .useMutation ({asynconMutate (opts ) {awaitutils .infinitePosts .list .cancel ();constallPosts =utils .infinitePosts .list .getInfiniteData ({limit : 10 });// [...]},});}
components/MyComponent.tsxtsximport {trpc } from '../utils/trpc';export functionMyComponent () {constutils =trpc .useUtils ();constmyMutation =trpc .infinitePosts .add .useMutation ({asynconMutate (opts ) {awaitutils .infinitePosts .list .cancel ();constallPosts =utils .infinitePosts .list .getInfiniteData ({limit : 10 });// [...]},});}
setInfiniteData()
Cet utilitaire vous permet de mettre à jour les données en cache d'une requête
components/MyComponent.tsxtsximport {trpc } from '../utils/trpc';export functionMyComponent () {constutils =trpc .useUtils ();constmyMutation =trpc .infinitePosts .delete .useMutation ({asynconMutate (opts ) {awaitutils .infinitePosts .list .cancel ();utils .infinitePosts .list .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.tsxtsximport {trpc } from '../utils/trpc';export functionMyComponent () {constutils =trpc .useUtils ();constmyMutation =trpc .infinitePosts .delete .useMutation ({asynconMutate (opts ) {awaitutils .infinitePosts .list .cancel ();utils .infinitePosts .list .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'),})),};});},});// [...]}