0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【React】ReactアプリにTanStackQueryライブラリを導入する方法

Posted at

ReactアプリにTanStackQueryを導入する方法について記載します。

TanStackQuery公式サイト

導入方法

実際の導入方法

1.. インストール

まずは必要なパッケージをインストールします。

npm install @tanstack/react-query
# または
yarn add @tanstack/react-query

2.QueryClient の設定(アプリ全体に適用)

main.tsx(または index.tsx)に、QueryClient QueryClientProvider を設定します。

main.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import { ChakraProvider, defaultSystem } from '@chakra-ui/react';
import { QueryClient,QueryClientProvider  } from "@tanstack/react-query";
import App from './App';

const queryClient = new QueryClient();

ReactDOM.createRoot(document.getElementById('root')!).render(
  <React.StrictMode>
    <ChakraProvider value={defaultSystem}>
      <QueryClientProvider client={queryClient}>
        <App />
      </QueryClientProvider>
    </ChakraProvider>
  </React.StrictMode>,
);

3. データ取得の基本例(useQuery)

例えば、APIからユーザー一覧を取得するコンポーネントを作ります。

src/tanstackQueryComponents/UserList.tsx
// components/UserList.tsx
import { useQuery } from "@tanstack/react-query";
import { Box, Spinner, Text, VStack } from "@chakra-ui/react";

type User = {
  id: number;
  name: string;
  email: string;
};

async function fetchUsers(): Promise<User[]> {
  const res = await fetch("https://jsonplaceholder.typicode.com/users");
  if (!res.ok) {
    throw new Error("ユーザーの取得に失敗しました");
  }
  return res.json();
}

export const UserList = () => {
  const { data, isLoading, isError, error } = useQuery<User[], Error>({
    queryKey: ["users"],
    queryFn: fetchUsers,
  });

  if (isLoading) return <Spinner />;
  if (isError) return <Text color="red.500">{error.message}</Text>;

  return (
    <VStack align="start">
      {data?.map((user) => (
        <Box key={user.id} p={4} borderWidth="1px" borderRadius="md" w="100%">
          <Text fontWeight="bold">{user.name}</Text>
          <Text>{user.email}</Text>
        </Box>
      ))}
    </VStack>
  );
};

4. ミューテーション(POST / PUT / DELETE)

データを変更する場合は useMutation を使います。

src/tanstackQueryComponents/AddUserButton.tsx
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { Button } from "@chakra-ui/react";

async function addUser(newUser: { name: string; email: string }) {
  const res = await fetch("https://jsonplaceholder.typicode.com/users", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(newUser),
  });
  return res.json();
}

export const AddUserButton = () => {
  const queryClient = useQueryClient();

  const mutation = useMutation({
    mutationFn: addUser,
    onSuccess: () => {
      // キャッシュ更新(再フェッチ)
      queryClient.invalidateQueries({ queryKey: ["users"] });
    },
  });

  return (
    <Button
      colorScheme="teal"
      onClick={() => mutation.mutate({ name: "新しいユーザー", email: "test@example.com" })}
      loading={mutation.isPending}
    >
      ユーザー追加
    </Button>
  );
};

App.tsx
// App.tsx
import React from "react";
import { Container, Heading, VStack } from "@chakra-ui/react";
import { UserList } from "@/tanstackQueryComponents/UserList";
import { AddUserButton } from "@/tanstackQueryComponents/AddUserButton";

const App: React.FC = () => {
  return (
    <Container maxW="container.md" py={8}>
      <VStack align="stretch">
        <Heading as="h1" size="lg" textAlign="center">
          ユーザー一覧(TanStack Query + Chakra UI)
        </Heading>

        <AddUserButton />

        <UserList />
      </VStack>
    </Container>
  );
};

export default App;

おまけ:開発支援:React Query Devtools

開発時にデバッグが超楽になるツールです。

npm install @tanstack/react-query-devtools

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?