この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは。データアナリティクス事業本部 サービスソリューション部の北川です。
SWRとは
SWRは、データの取得や更新に便利なReact Hooksライブラリになります。Next.jsを開発していることでも有名な、Vercelが提供しています。
developersIOでも以下のエントリが投稿されています。
少し前にSWR 2.0が発表されました。今回はその中で、useSWRMutaion
を使ってみました。
useSWRMutaion
useSWRMutaionでは、通常のuseSWRのようにレンダリング時にミューテーションを行うのではなく、任意のタイミングでミューテーションを実行できます。また、ミューテーション時の状態を取得することで、データ更新の挙動を制御できます。
SWR 2.0 では、新しいフック useSWRMutation によって、宣言的な API を使用してリモートでデータを変更することがより簡単になりました。このフックを使って変異をセットアップし、後でそれを有効にすることができます。
使ってみる
useMutationが持つtrigger
を使うことで、mutationを実行します。
また、isMutating
により、mutationの状態を取得できます。triggerとisMutatingにより、データの更新のステップをより簡潔に実装することができます。
以下の例では、新規でユーザーを作成する関数を、ボタンが押されたタイミングで実行するようになります。
import { useState } from "react";
import useSWRMutation from "swr/mutation";
const addUser = async (url: string, { arg }: { arg: string }) => {
return fetch(url, {
method: "POST",
body: JSON.stringify(arg),
});
};
const App = () => {
const { trigger, isMutating } = useSWRMutation("api/user", addUser);
const [user, setUser] = useState("");
return (
<>
<input type={"text"} onChange={(e) => setUser(e.target.value)} />
{user.length > 0 ? (
<button disabled={isMutating} onClick={() => trigger(user)}>
{isMutating ? "追加中" : "ユーザーの追加"}
</button>
) : null}
</>
);
};
export default App;
ミューテーションの結果を取得
useSWRMutaionの返り値dataから、ミューテーションの結果を取得できます。useSWRMutationでは他に、状態をリセットする関数などがあります。
- data: ミューテーションの結果
- error: ミューテーション時のエラー
- trigger(arg, options): ミューテーションを発火させるためのフック
- reset: 状態をリセットするための関数
- isMutating: ミューテーションの状態
const App = () ={
const { data, trigger, isMutating } = useSWRMutation("api/user", addUser);
const [user, setUser] = useState("");
console.log("data", data);
return (
/*...*/
);
};
データの遅延読み込み
useSWRMutationでは、triggerが呼ばれるまでリクエストを行わないので、データの遅延読み込みにも適しています。
以下では、jsonplaceholderのAPIを使って、ボタンが押された時にリクエストを実行します。
import { useState } from "react";
import useSWRMutation from "swr/mutation";
const getUser = async (url: string, { arg }: { arg: number }) => {
return fetch(`${url}/${arg}`).then((res) => res.json());
};
const App = () => {
const {
trigger,
data: user,
isMutating,
} = useSWRMutation("https://jsonplaceholder.typicode.com/users", getUser);
const [id, setId] = useState(1);
console.log("user", user);
return (
<>
<input
type={"number"}
value={id}
onChange={(e) => setId(Number(e.target.value))}
/>
<button disabled={isMutating} onClick={() => trigger(id)}>
{isMutating ? "取得中" : "ユーザーの取得"}
</button>
{user ? user.name : null}
</>
);
};
export default App;
まとめ
今回は、SWR2.0で追加されたuseSWRMutaionを使ってみました。今回のバージョンアップでは他にも、更新中の仮データをUI上で提供するOptimistic UIなど、便利な機能が追加されたのでそちらも使っていきたいと思います。
ではまた。