Typsäkra API:er från frontend till backend med tRPC · Lektion

Avancerad integration med React Query

Använd React Query:s kraftfulla funktioner, som förhämtning, ogiltigförklaring och bakgrundshämtning, med tRPC.

Lektion 2 av 411 steg

Avancerad integration med React Query är en gratis lektion i Typsäkra API:er från frontend till backend med tRPC på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Typsäkra API:er från frontend till backend med tRPC, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Typsäkra API:er från frontend till backend med tRPC innehåller totalt 4 lektioner.

Avancerad React Query med tRPC

Välkommen! I den här lektionen går vi igenom avancerade funktioner i React Query som ger dina tRPC-applikationer extra kraft.

Du får lära dig att optimera användarupplevelsen och säkerställa att data är aktuell med kraftfulla tekniker som förhämtning, ogiltigförklaring av frågor och bakgrundshämtning på nytt.

Förbättra användarupplevelsen med förhämtning

Förhämtning innebär att hämta data innan användaren uttryckligen efterfrågar den. Föreställ dig en lista över blogginlägg: när användaren håller muspekaren över ett inlägg kan du förhämta det detaljerade innehållet.

  • Snabbare navigering: Minskade laddningstider när användaren klickar på en länk.
  • Smidigare upplevelse: Laddningsindikatorer på efterföljande sidor försvinner.
  • Förutseende gränssnitt: Appen känns snabbare och mer responsiv.

Förhämta tRPC-frågor

React Querys queryClient.prefetchQuery låter dig hämta data och lagra den i cachen. Med tRPC kommer du åt queryClient via trpc.useUtils().

Det här exemplet simulerar förhämtning av en lista med inlägg när en komponent renderas, kanske på en startsida innan användaren klickar på "Visa alla inlägg".

// A simplified demo for prefetching a tRPC query

// --- Mocks for demonstration purposes ---
const mockQueryClient = {
  prefetchQuery: async (queryKey, queryFn) => {
    console.log(`Prefetching: ${JSON.stringify(queryKey)}`);
    // Simulate API call
    const data = await queryFn();
    console.log(`Data for ${JSON.stringify(queryKey)} prefetched:`, data);
    return data;
  }
};

const trpc = {
  post: {
    list: {
      queryFn: async () => {
        // In a real app, this would be your tRPC query
        return new Promise(resolve => setTimeout(() => {
          resolve([{ id: 1, title: 'First Post' }, { id: 2, title: 'Second Post' }]);
        }, 100));
      }
    }
  },
  useUtils: () => ({
    queryClient: mockQueryClient
  })
};
// --- End Mocks ---

async function main() {
  console.log("Starting prefetch demo...");

  // In a React component, you'd call trpc.useUtils()
  const utils = trpc.useUtils();

  // Prefetch the 'post.list' query
  await utils.queryClient.prefetchQuery(
    ['post', 'list'], // tRPC query key
    trpc.post.list.queryFn // The actual fetch function
  );

  console.log("Prefetching complete. Data is now in cache.");
}

main();

Håll data aktuell med ogiltigförklaring

När du utför en åtgärd som ändrar data i backend, till exempel skapar, uppdaterar eller tar bort data, kan cachen på klientsidan bli inaktuell.

Ogiltigförklaring av frågor meddelar React Query att vissa cachade data är "inaktuella" och måste hämtas på nytt nästa gång de används. Det säkerställer att gränssnittet alltid visar den senaste informationen.

Ogiltigförklara efter tRPC-mutationer

Det vanligaste användningsområdet för ogiltigförklaring är efter en mutation. När du skapar ett nytt objekt vill du att listan över alla objekt ska uppdateras automatiskt.

Du kan använda callbacken onSuccess i useMutation för att ogiltigförklara relaterade frågor.

// A simplified demo for invalidating a tRPC query after a mutation

// --- Mocks for demonstration purposes ---
const mockQueryClient = {
  invalidateQueries: (queryKey) => {
    console.log(`Invalidating queries matching: ${JSON.stringify(queryKey)}`);
    // In a real app, this marks cached data as stale
  }
};

const trpc = {
  post: {
    create: {
      mutateFn: async (newPost) => {
        console.log(`Creating post: ${newPost.title}...`);
        return new Promise(resolve => setTimeout(() => {
          console.log("Post created on server.");
          resolve({ id: 3, ...newPost });
        }, 150));
      }
    }
  },
  useUtils: () => ({
    queryClient: mockQueryClient
  })
};

// Simulate a useMutation hook's logic
async function useCreatePostMutation() {
  const utils = trpc.useUtils();

  return {
    mutateAsync: async (newPost) => {
      const result = await trpc.post.create.mutateFn(newPost);
      // Invalidate the 'post.list' query to refetch it
      utils.queryClient.invalidateQueries(['post', 'list']);
      return result;
    }
  };
}
// --- End Mocks ---

async function main() {
  console.log("Starting invalidation demo...");

  const { mutateAsync } = await useCreatePostMutation();

  await mutateAsync({ title: 'My New Awesome Post' });

  console.log("Mutation complete and 'post.list' query invalidated.");
  console.log("Next time 'post.list' is fetched, it will be fresh.");
}

main();

Välj specifika frågor

Ibland vill du inte ogiltigförklara alla frågor av en viss typ. Du kanske vill ogiltigförklara ett specifikt objekt, till exempel ett enskilt inlägg efter att det har uppdaterats.

React Query använder frågenycklar för att identifiera cachade data. Du kan ogiltigförklara frågor utifrån exakta nycklar eller partiella matchningar.

// Demo for granular invalidation

// --- Mocks ---
const mockQueryClient = {
  invalidateQueries: (queryKey) => {
    console.log(`Invalidating specific queries: ${JSON.stringify(queryKey)}`);
  }
};

const trpc = {
  post: {
    update: {
      mutateFn: async (postId, updates) => {
        console.log(`Updating post ${postId} with:`, updates);
        return new Promise(resolve => setTimeout(() => {
          console.log(`Post ${postId} updated.`);
          resolve({ id: postId, ...updates });
        }, 100));
      }
    }
  },
  useUtils: () => ({
    queryClient: mockQueryClient
  })
};

async function useUpdatePostMutation() {
  const utils = trpc.useUtils();

  return {
    mutateAsync: async (postId, updates) => {
      const result = await trpc.post.update.mutateFn(postId, updates);
      // Invalidate the specific post query by ID
      utils.queryClient.invalidateQueries(['post', 'byId', { id: postId }]);
      // You might also invalidate the list if the update affects it
      utils.queryClient.invalidateQueries(['post', 'list']);
      return result;
    }
  };
}
// --- End Mocks ---

async function main() {
  console.log("Starting granular invalidation demo...");
  const { mutateAsync } = await useUpdatePostMutation();
  const postIdToUpdate = 123;

  await mutateAsync(postIdToUpdate, { title: 'Updated Title' });

  console.log(`Queries for post ${postIdToUpdate} and post list invalidated.`);
}

main();

Automatisk bakgrundshämtning

React Query hämtar inte bara data på nytt när du ogiltigförklarar den manuellt. Det har även smarta standardinställningar för bakgrundshämtning.

När en fråga blir "inaktuell" (när dess staleTime löper ut) hämtar React Query automatiskt data på nytt i bakgrunden under vissa förhållanden, till exempel:

  • När en komponent monteras.
  • När fönstret får fokus igen.
  • När nätverksanslutningen återupprättas.

Anpassa beteendet för ny datahämtning

Du kan styra när data ska betraktas som inaktuell med alternativet staleTime. Som standard är staleTime 0, vilket innebär att data blir inaktuell direkt.

Om du anger ett värde för staleTime (till exempel 5 * 60 * 1000 för 5 minuter) hämtas data inte på nytt under den perioden, även om komponenter monteras om eller fönstret får fokus igen. Det förbättrar prestandan.

// Demo for configuring staleTime globally

// --- Mocks ---
class QueryClient {
  constructor(options = {}) {
    this.defaultOptions = options.defaultOptions || {};
    console.log("QueryClient initialized with defaultOptions:", this.defaultOptions);
  }
  // Simplified method to show it would apply options
  fetchQuery(queryKey, queryFn, options = {}) {
    const effectiveStaleTime = options.staleTime !== undefined
      ? options.staleTime
      : (this.defaultOptions.queries && this.defaultOptions.queries.staleTime !== undefined
          ? this.defaultOptions.queries.staleTime
          : 0); // Default React Query staleTime
    console.log(`Fetching ${JSON.stringify(queryKey)} with staleTime: ${effectiveStaleTime}`);
    return queryFn(); // Simulate fetch
  }
}

// Simulating React Query's QueryClientProvider setup
function QueryClientProvider({ children, client }) {
  console.log("QueryClientProvider is setting up the client.");
  // In a real React app, 'client' would be available via context
  if (typeof children === 'function') {
    children(client); // Just call the child function for this demo
  }
}
// --- End Mocks ---

async function main() {
  console.log("Starting staleTime configuration demo...");

  const queryClient = new QueryClient({
    defaultOptions: {
      queries: {
        staleTime: 1000 * 60 * 5, // 5 minutes
        refetchOnWindowFocus: false, // Disable refetch on window focus globally
      },
    },
  });

  QueryClientProvider({
    client: queryClient,
    children: async (client) => {
      // Simulate a tRPC query being made, which would inherit these options
      await client.fetchQuery(['myPost', 1], async () => {
        console.log("Simulating a fetch for 'myPost'.");
        return { id: 1, title: "Configured Post" };
      });
    }
  });

  console.log("QueryClient configured. Queries will respect 5 min staleTime.");
}

main();

Ett komplett arbetsflöde

Föreställ dig ett användarflöde som kombinerar dessa funktioner:

  1. Användaren öppnar en kontrollpanel. Vi förhämtar data för kommande avsnitt.
  2. Användaren klickar på "Redigera profil". Profilinformationen finns redan i cachen tack vare förhämtning eller en nylig datahämtning.
  3. Användaren uppdaterar sitt namn. En mutation startas.
  4. När åtgärden lyckas ogiltigförklaras profilfrågan.
  5. Gränssnittet hämtar automatiskt data på nytt i bakgrunden (på grund av ogiltigförklaringen och eventuellt staleTime: 0 för profilfrågan) och visar det nya namnet utan att hela sidan behöver laddas om eller uppdateras manuellt.

Frågesport om React Query-funktioner

Föreställ dig en tRPC-applikation med en lista över produkter och ett formulär för att lägga till en ny produkt.

Vilken kombination av funktioner i React Query skulle du använda för att omedelbart uppdatera produktlistan efter att en ny produkt har lagts till?

Sammanfattning av avancerade funktioner

Bra jobbat! Du har lärt dig att utnyttja avancerade funktioner i React Query för att bygga mycket prestandaeffektiva och användarvänliga tRPC-applikationer.

  • Förhämtning förbättrar den upplevda prestandan genom att läsa in data tidigt.
  • Ogiltigförklaring av frågor säkerställer att data är aktuell efter mutationer.
  • Bakgrundshämtning uppdaterar automatiskt inaktuell data.

Dessa tekniker är avgörande för professionell frontendutveckling. Fortsätt att experimentera med dem!

Gratis att börja

Lär dig Typsäkra API:er från frontend till backend med tRPC med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
10
Lektioner
40

Vanliga frågor

Är lektionen ”Avancerad integration med React Query” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Typsäkra API:er från frontend till backend med tRPC, inklusive ”Avancerad integration med React Query”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Typsäkra API:er från frontend till backend med tRPC innehåller totalt 4 lektioner.

Vad lär jag mig i ”Avancerad integration med React Query”?

Använd React Query:s kraftfulla funktioner, som förhämtning, ogiltigförklaring och bakgrundshämtning, med tRPC. Ni övar på Typsäkra API:er från frontend till backend med tRPC med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Typsäkra API:er från frontend till backend med tRPC?

Du behöver inga förkunskaper. Utbildningen i Typsäkra API:er från frontend till backend med tRPC på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Avancerad integration med React Query”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Typsäkra API:er från frontend till backend med tRPC-lektionen?

Ja. Varje Typsäkra API:er från frontend till backend med tRPC-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. tRPC med Next.js App Router
  2. Avancerad integration med React Query
  3. Serverkomponenter och datahämtning med tRPC
  4. Optimistiska uppdateringar med tRPC-mutationer
← Tillbaka till Typsäkra API:er från frontend till backend med tRPC