■目次

React Queryの導入 / 使い方

▼公式

TanStack Query | React Query, Solid Query, Svelte Query, Vue Query

導入

  1. 該当プロジェクトを開いているVSCodeでターミナルを開き、以下コマンドを実行する

    <aside> 🌿 axiosもインストールしてね

    </aside>

    npm i @tanstack/react-query axios
    

初期設定【プロバイダーを設置する】

  1. index.tsx(js)かApp.tsx(js)を開き、@tanstack/react-queryからQueryClientQueryClientProviderをimportする

    import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
    
  2. QueryClient のインスタンスを生成し、定数queryClientに格納する

    これでアプリケーション全体の共通設定みたいなことができる

    import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
    
    **const queryClient = new QueryClient();**
    
    〜〜〜
    
  3. QueryClientProvider でAppコンポーネントをラップする

    import React from 'react';
    import ReactDOM from 'react-dom/client';
    import './index.css';
    import App from './App';
    import reportWebVitals from './reportWebVitals';
    import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
    
    const queryClient = new QueryClient();
    
    const root = ReactDOM.createRoot(
      document.getElementById('root') as HTMLElement
    );
    root.render(
      <React.StrictMode>
        **<QueryClientProvider client={queryClient}>
          <App /> 
        </QueryClientProvider>**
      </React.StrictMode>
    );
    
    // If you want to start measuring performance in your app, pass a function
    // to log results (for example: reportWebVitals(console.log))
    // or send to an analytics endpoint. Learn more: <https://bit.ly/CRA-vitals>
    reportWebVitals();
    
  4. 初期設定完了!

使い方

  1. 外部データを取得・使用したいコンポーネントファイルを開く

    (TypeScriptの場合)外部データの型定義なども記述またはimportしておく

    ▼コード例

    /** 外部import */
    import { FC } from "react";
    
    **type Album = {
      userId: number;
      id: number;
      title: string;
    };**
    
    export const ReactQuery: FC = () => {
      return (
        <div>
          <p>React Query</p>
        </div>
      );
    };
    
  2. @tanstack/react-query からuseQueryメソッドをimportする

    /** 外部import */
    import { FC } from "react";
    **import { useQuery } from "@tanstack/react-query";**
    
    type Album = {
      userId: number;
      id: number;
      title: string;
    };
    
    export const ReactQuery: FC = () => {
      return (
        <div>
          <p>React Query</p>
        </div>
      );
    };
    
  3. useQuery はクエリした結果を返してくれるメソッドなので、分割代入で受け取れるよう、雛型を記述する

    (TypeScriptの場合)戻り値が何かを型定義しておく。おそらく冒頭で定義した外部データになるはず。

    /** 外部import */
    import { FC } from "react";
    import { useQuery } from "@tanstack/react-query";
    
    type Album = {
      userId: number;
      id: number;
      title: string;
    };
    
    export const ReactQuery: FC = () => {
      **const { } = useQuery<Album[]>();**
    
      return (
        <div>
          <p>React Query</p>
        </div>
      );
    };
    
  4. 続けて、useQuery() に2つの引数をセットする

    ▼コード例

    /** 外部import */
    import { FC } from "react";
    import { useQuery } from "@tanstack/react-query";
    
    type Album = {
      userId: number;
      id: number;
      title: string;
    };
    
    export const ReactQuery: FC = () => {
      const { } = useQuery<Album[]>(**["albums"], fetchAlbums**);
    
      return (
        <div>
          <p>React Query</p>
        </div>
      );
    };
    
  5. 第二引数にセットしたフェッチャー関数の処理を記述する

    別ファイルに分割しても、同じファイル内に記述してもOK!

    <aside> 🌿 データ取得なので、async/awaitaxiosfetchメソッドを使おう!

    </aside>

    ▼コード例

    /** 外部import */
    import { FC } from "react";
    import { useQuery } from "@tanstack/react-query";
    import axios from "axios";
    
    type Album = {
      userId: number;
      id: number;
      title: string;
    };
    
    **const fetchAlbums = async() => {
      const result = await axios.get<Album[]>("<https://jsonplaceholder.typicode.com/albums>");**
    // axiosの場合、.dataに取得データが格納されている
      **return result.data;
    }**
    
    export const ReactQuery: FC = () => {
      const { } = useQuery<Album[]>(["albums"], fetchAlbums);
    
      return (
        <div>
          <p>React Query</p>
        </div>
      );
    };
    
  6. useQuery の分割代入に、値をセットする

    <aside> 🌿 Suspenseと併用する場合はdataだけでOK!

    </aside>

    【セットできる値】

    etc…

    Queries | TanStack Query Docs

    ▼コード例

    /** 外部import */
    import { FC } from "react";
    import { useQuery } from "@tanstack/react-query";
    import axios from "axios";
    
    type Album = {
      userId: number;
      id: number;
      title: string;
    };
    
    const fetchAlbums = async() => {
      const result = await axios.get<Album[]>("<https://jsonplaceholder.typicode.com/albums>");
      return result.data;
    }
    
    export const ReactQuery: FC = () => {
      const **{ isLoading, error, data }** = useQuery<Album[]>(["albums"], fetchAlbums);
    
      return (
        <div>
          <p>React Query</p>
        </div>
      );
    };
    
  7. 分割代入で取得した各値を適宜使ってコンポーネントを実装していく

    ▼コード例

    /** 外部import */
    import { FC } from "react";
    import { useQuery } from "@tanstack/react-query";
    import axios from "axios";
    
    type Album = {
      userId: number;
      id: number;
      title: string;
    };
    
    const fetchAlbums = async() => {
      const result = await axios.get<Album[]>("<https://jsonplaceholder.typicode.com/albums>");
      return result.data;
    }
    
    export const ReactQuery: FC = () => {
      const { isLoading, error, data } = useQuery<Album[]>(["albums"], fetchAlbums);
    
    	// Suspenseを使うと、もっと宣言的に記述できる
      **if (error) return <p>エラーです!</p>;
      if (isLoading) return <p>ローディング中だよ〜</p>;**
    
      return (
        <div>
          <p>React Query</p>
          **{data?.map((album) => (
            <p key={album.id}>{album.title}</p>
          ))}**
        </div>
      );
    };