Use Cases

TanStack Query dengan Claude Code

Pelajari tentang tanstack query menggunakan Claude Code. Dilengkapi tips praktis dan contoh kode.

TanStack Queryでserver状態manajemenをoptimasi

TanStack Query(旧React Query) server状態 pengambilan・cache・同期 宣言的 manajemen library.Claude Code 使えば、kompleksなcache戦略や楽観的pembaruan juga 素早くimplementasi bisa dilakukan.

dasar的なquery設計

Claude Code データpengambilanpola 依頼し.

> TanStack Query dengan penggunadaftar query buatkan.
> pagination、pencarianフィルタ、自動リフレッシュdukungan dengan 。
import { useQuery, keepPreviousData } from "@tanstack/react-query";

// queryキーファクトリー
export const userKeys = {
  all: ["users"] as const,
  lists: () => [...userKeys.all, "list"] as const,
  list: (filters: UserFilters) => [...userKeys.lists(), filters] as const,
  details: () => [...userKeys.all, "detail"] as const,
  detail: (id: string) => [...userKeys.details(), id] as const,
};

interface UserFilters {
  page: number;
  perPage: number;
  search?: string;
  role?: string;
}

export function useUsers(filters: UserFilters) {
  return useQuery({
    queryKey: userKeys.list(filters),
    queryFn: () => fetchUsers(filters),
    placeholderData: keepPreviousData,
    staleTime: 5 * 60 * 1000, // 5分間 cache penggunaan
    refetchOnWindowFocus: true,
  });
}

export function useUser(id: string) {
  return useQuery({
    queryKey: userKeys.detail(id),
    queryFn: () => fetchUser(id),
    enabled: !!id,
    staleTime: 10 * 60 * 1000,
  });
}

implementasi 楽観的pembaruan

mutation dan 楽観的pembaruan pola Claude Code generate juga らい.

import { useMutation, useQueryClient } from "@tanstack/react-query";

export function useUpdateUser() {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: (data: { id: string; updates: Partial<User> }) =>
      updateUser(data.id, data.updates),

    onMutate: async ({ id, updates }) => {
      // 進行中 query キャンセル
      await queryClient.cancelQueries({ queryKey: userKeys.detail(id) });

      // 現在 データ バックアップ
      const previousUser = queryClient.getQueryData(userKeys.detail(id));

      // cache 楽観的 pembaruan
      queryClient.setQueryData(userKeys.detail(id), (old: User) => ({
        ...old,
        ...updates,
      }));

      return { previousUser };
    },

    onError: (_err, { id }, context) => {
      // error時 ロールバック
      if (context?.previousUser) {
        queryClient.setQueryData(userKeys.detail(id), context.previousUser);
      }
    },

    onSettled: (_data, _error, { id }) => {
      // berhasil・gagal 関わらず再pengambilan
      queryClient.invalidateQueries({ queryKey: userKeys.detail(id) });
      queryClient.invalidateQueries({ queryKey: userKeys.lists() });
    },
  });
}

Implementasi Infinite Scroll

useInfiniteQuery 使った無限scroll juga Claude Code 素早くimplementasi bisa dilakukan.

import { useInfiniteQuery } from "@tanstack/react-query";

export function useInfiniteUsers(search?: string) {
  return useInfiniteQuery({
    queryKey: ["users", "infinite", { search }],
    queryFn: ({ pageParam }) =>
      fetchUsers({ page: pageParam, perPage: 20, search }),
    initialPageParam: 1,
    getNextPageParam: (lastPage) =>
      lastPage.hasNext ? lastPage.page + 1 : undefined,
    getPreviousPageParam: (firstPage) =>
      firstPage.hasPrev ? firstPage.page - 1 : undefined,
  });
}

function UserInfiniteList() {
  const { data, fetchNextPage, hasNextPage, isFetchingNextPage } =
    useInfiniteUsers();

  const users = data?.pages.flatMap((page) => page.users) ?? [];

  return (
    <div>
      {users.map((user) => (
        <UserCard key={user.id} user={user} />
      ))}
      {hasNextPage && (
        <button onClick={() => fetchNextPage()} disabled={isFetchingNextPage}>
          {isFetchingNextPage ? "Loading..." : "もっと見る"}
        </button>
      )}
    </div>
  );
}

prefetchとSSRdukungan

Next.js dll. serverサイドprefetch juga implementasi bisa dilakukan.

import { QueryClient, dehydrate, HydrationBoundary } from "@tanstack/react-query";

export async function getServerSideProps() {
  const queryClient = new QueryClient();

  await queryClient.prefetchQuery({
    queryKey: userKeys.list({ page: 1, perPage: 20 }),
    queryFn: () => fetchUsers({ page: 1, perPage: 20 }),
  });

  return {
    props: {
      dehydratedState: dehydrate(queryClient),
    },
  };
}

export default function UsersPage({
  dehydratedState,
}: {
  dehydratedState: unknown;
}) {
  return (
    <HydrationBoundary state={dehydratedState}>
      <UserList />
    </HydrationBoundary>
  );
}

pola カスタムqueryフック

実務 再pemanfaatandimungkinkanなカスタムフック sebagai 設計.

function useOptimisticDelete<T extends { id: string }>(
  queryKey: readonly unknown[],
  deleteFn: (id: string) => Promise<void>
) {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: deleteFn,
    onMutate: async (id) => {
      await queryClient.cancelQueries({ queryKey });
      const previous = queryClient.getQueryData(queryKey);

      queryClient.setQueryData(queryKey, (old: T[] | undefined) =>
        old?.filter((item) => item.id !== id)
      );

      return { previous };
    },
    onError: (_err, _id, context) => {
      queryClient.setQueryData(queryKey, context?.previous);
    },
    onSettled: () => {
      queryClient.invalidateQueries({ queryKey });
    },
  });
}

Summary

TanStack Query server状態manajemen kompleksさ 大幅 軽減 くれ.Claude Code pemanfaatanすれば、queryキー設計、楽観的pembaruan、無限scroll dll. kompleksなpola juga waktu singkat implementasidimungkinkan.

状態manajemen 全体設計 Zustand状態manajemenpanduan 、API type safety性 tRPCtype safetyAPIpengembangan silakan lihat.TanStack Query公式dokumen juga konfirmasi おき.

#Claude Code #TanStack Query #React #データpengambilan #caching