てらブログ

てらブログ

日々の学習の備忘録

Tanstack Queryをキャッチアップしたい

目的

Tanstack Queryをプロジェクトで使用することになった。
元々データフェッチやAPI周りの知識も少なかったので、この機会にしっかりキャッチアップしたいと思った。

Tanctack Queryについて

about

Webアプリケーションのためのデータフェッチライブラリとしてよく説明されるが、より技術的な用語では、Webアプリケーションのフェッチ、キャッシュ、同期、およびサーバーステートの更新を容易にする。
React Queryから改名してTanstack Queryになった。Vueなどサーポート範囲が増えたらしい。
npm trendsによると直近1年では一番使用されている。

簡単な使い方

useQuery Hook を利用したコード。データフェッチはfetch関数で。

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

const fetchTodos = async () => {
  const res = await fetch("http://localhost:3001/todos");
  return res.json();
};

const Todo = () => {
  const { data: todos } = useQuery(["todos"], fetchTodos);

  return (
    <div>
      <h1>Todo一覧</h1>
      <ul>
        {todos?.map((todo) => (
          <li key={todo.id}>{todo.name}</li>
        ))}
      </ul>
    </div>
  );
};

export default Todo;

また、ルートファイルで QueryClientProvider、QueryClient の設定を行う。Todo コンポーネントで useQuery を利用するためには Todo コンポーネントを QueryClientProvider で wrap する必要がある。

import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import Todo from './components/Todo';
import './App.css';

const queryClient = new QueryClient();

function App() {
  return (
    <QueryClientProvider client={queryClient}>
      <div className="App">
        <Todo />
      </div>
    </QueryClientProvider>
  );
}

export default App;

useQuery の戻り値のオブジェクトは、 data 以外にもさまざまな情報が戻される。
参照:
useQuery | TanStack Query Docs

豊富なオプション

useQueryやuseMutationにオプションを渡すことができる。
POST リクエスト成功時に実行される onSuccess, エラー時に実行させる onError, 成功、エラーに関わらず実行される onSettled、POST リクエスト実行前に実行される onMutate などがある。
例えばonSuccessを使用すると、追加ボタンをクリックした後にリクエストが成功するとリロードなどを行わずに追加したデータをブラウザ上に反映することができる(リフェッチ処理ができる)。

import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
//略
const Todo = () => {
  const [name, setName] = useState('');
  const queryClient = useQueryClient();
//略
  const addMutation = useMutation(addTodo, {
    onSuccess: () => {
      queryClient.invalidateQueries('todos');
    },
  });
//略

残課題

optimistic updateについて、挙動や使用するべきケースを確認したい。
Optimistic Updates | TanStack Query Docs