logo

【React-query使い方】useEffectなしでReact におけるAPIデータの取得方法(TypeScript対応)

【REACT-QUERY使い方】USEEFFECTなしでREACT におけるAPIデータの取得方法(TYPESCRIPT対応)...
プログラミング
目次
  • React VITE のセットアップ

  • ファイル構成

  • プロジェクト内容

  • main.tsx (index.js) ファイル

  • App.tsx (.jsx) ファイル

  • 終わりに

  • React を使っているプロジェクトでAPIデータを取得するのはほぼ必須になるかと思います。

    Web開発において、APIからデータを取得することは避けられない重要なプロセスです。その際にuseEffect内でAPIデータの取得をしているなら要注意。

    useEffectでAPI データを取得するのは、 Reactの公式ガイドラインでも推奨されていません。

    ここで登場するのが、react-queryという強力なライブラリです。
    react-queryは、APIデータ取得のための煩わしさを軽減し、データのキャッシュ、同期、更新といった複雑なプロセスを簡単に扱うことができます。

    react-query npm package: https://www.npmjs.com/package/react-query

    下記のような機能を持っています。

    • オブジェクト操作
    • 配列操作
    • データ取得時の読み込み状態や、エラー状態の管理を簡単にする
    • データ構造の変換など

    これらの機能を駆使することで、より洗練されたデータ取得方法を実現できます。

    この記事を読むことで、useEffectを使用する従来の方法から脱却し、react-queryを利用することで、アプリケーションのパフォーマンスを向上させると同時に、コードの可読性も高めることができます。

    React VITE のセットアップ

    react set up

    React Vite のインストール

    npm create vite@latest

    react-queryのインストール

    
    npm install react-query

    BootStrap (オプション)

    npm install bootstrap

    ファイル構成

    src
      -- App.tsx
      -- main.tsx (index.js)

    プロジェクト内容

    Random Fox API https://randomfox.ca/
    GitLab レポジトリー
    デモサイトURL

    スタイルにはBootStrapを使用しています。

    react-query を使い、Random Fox API からランダムな画像リンクと、URLを取得します。

    下記がこのプロジェクトの機能です。

    • 画像の下にある青いボタンを押すことで、データをフェッチし画像とそのURLリンクを取得
    • 画像が出力されるまで “Loading…” と表示
    • エラーの際にはエラーメッセージを出力
    • さらに初回のレンダリング時に、次の Fox の画像を前もって取得。読み込みが少しだけ速くなっている仕様

    react-queryはデータ取得時の読み込み状態やエラー状態の管理を簡単にして、ユーザー体験を向上させます。初回レンダリング時に次のデータを先読みする機能は、アプリケーションの応答性を高める一例です。

    main.tsx (index.js) ファイル

    import React from 'react'
    import ReactDOM from 'react-dom/client'
    import App from './App.tsx'
    import './index.css'
    
    // react-query
    import { QueryClient, QueryClientProvider } from 'react-query';
    
    const queryClient = new QueryClient();
    
    // bootstrap
    import '../node_modules/bootstrap/dist/css/bootstrap.min.css'
    
    ReactDOM.createRoot(document.getElementById('root')!).render(
      <QueryClientProvider client={queryClient}>
        <React.StrictMode>
          <App />
        </React.StrictMode>
      </QueryClientProvider>
    )
    

    App.tsx (.jsx) ファイル

    import { useQuery } from 'react-query';
    import { useMutation, useQueryClient } from 'react-query';
    
    function App() {
      const queryClient = useQueryClient();
    
      // API fetch
      const fetchFox = async () => {
        const res = await fetch('https://randomfox.ca/floof/');
        return res.json();
      };
    
      const mutation = useMutation(fetchFox, {
        onSuccess: (data) => {
          // フェッチしたデータでクエリデータを手動で更新する
          queryClient.setQueryData('myData', data);
        },
      });
    
      // 次の画像のデータを prefetch する関数
      const prefetchNextFoxImage = async () => {
        await queryClient.prefetchQuery('nextFoxImage', fetchFox);
      };
    
      // ボタンクリックでフェッチをトリガー
      const fetchOnButtonClick = () => {
        mutation.mutate();
      };
    
      // react-query
      const { isLoading, error, data } = useQuery('myData', fetchFox, {
        initialData: () => {
          // 初回レンダリング時に nextFoxImage のデータを prefetch する
          prefetchNextFoxImage();
          return queryClient.getQueryData('nextFoxImage');
        },
        refetchOnWindowFocus: false, // フォーカス時の自動リフェッチを無効化
      });
    
      if (isLoading) return 'Loading...';
      if (error) return 'An error occurred: ' + (error as Error).message;
    
      return (
        <div className='container text-center'>
          <h1 className='display-3'>🦊 FOX image</h1>
          <img src={data?.image} alt="Fox" style={{ width: "600px", height: "450px", objectFit: "cover" }} />
          <div>
            <a href={data?.link} target="_blank">Link</a>
          </div>
          <button onClick={fetchOnButtonClick} onMouseEnter={prefetchNextFoxImage} className="btn btn-primary mt-4">Show Another Fox</button>
        </div>
      );
    }
    export default App;

    終わりに

    この記事を通じて、React開発におけるAPIデータの取得方法として、useEffectを使わずにreact-queryを活用するアプローチを紹介しました。

    react-queryを使うことで、データのキャッシュ、同期、および更新が簡単になり、アプリケーションのパフォーマンスとコードの可読性を同時に向上させることができます。

    今回はRandom Fox APIを例に、データ取得から表示までのプロセスを実践しました。任意のAPIデータ取得シナリオに応用できるので、Reactを使ったプロジェクトで直面するデータ取得課題を解決する練習になるかと思います!

    この記事がReactでAPIデータを扱う際に、より効率的で使いやすいデータ取得方法を実現するための参考になれば幸いです。

    人気記事

    メルボルン移住(ワーホリ)を検討している方へ
    オーストリア
    メルボルン移住(ワーホリ)を検討している方へ
    メルボルンで絶対に行きたい場所10選
    オーストリア
    メルボルンで絶対に行きたい場所10選
    『ネイティブ監修』 オーストラリア厳選スラング30
    英語
    『ネイティブ監修』 オーストラリア厳選スラング30
    海外のWEBエンジニア特化スクールの費用や授業内容や費用など完全解説(オーストラリア・メルボルン)
    オーストリア
    海外のWEBエンジニア特化スクールの費用や授業内容や費用など完全解説(オーストラリア・メルボルン)
    • Kazu

      Kazu

      オーストラリア在住歴7年。現地で英語学習後に日本語教師 → 工場就職 → 海外WEB開発ディプロマを取得→フリーランス。現在は余った時間をプログラミング&ブログに費やして生きています。

    77