2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

useHydrateAtomsの使い方

Last updated at Posted at 2023-07-09

jotaiライブラリーのuseHydrateAtomsを勉強した

自己紹介

私は41歳から独学でプログラミングをはじめ現在45歳。
最近やっと自分でアプリをく作れるようになってきました。

この記事はuseHydrateAtomsの使い方の備忘録です。
間違いあるかもしれませんので、ご了承ください。

概要

フルスタックで自作アプリを作成した時に
フロントエンドとバックエンドを状態が初期状態で不一致していて困ったことがありました。
それを解消するために、
ブラウザ起動後、すぐにバックエンドのデータをフェッチする方法で動作的には問題なくなりました。
でも、フェッチ完了するまでの間に古い状態(フロントが持っている初期状態)が一瞬チラ見えするのが
美しくないなあと思って、いろいろ調べた結果、
useHydrateAtomを見つけました。

下準備

まずは普通に書くと以下3つのコード。
「hoge hoge]が一瞬チラ見えします。

App.jsx
import './App.css';
import { User } from './components/User';

function App() {
  return (
    <>
      <User/>
    </>
  );
}

export default App;
import { atom } from 'jotai';

export const userAtom = atom([
  {
    id: 100,
    name: 'hogo hoge',
    username: 'foo',
    email: 'aaa@aaa.com',
  }
]);
User.jsx(修正前)
import React, {useEffect} from 'react';
import { useAtom } from 'jotai';
import { userAtom } from '../atoms/usersAtom';
import axios from 'axios';

export const User = () => {
  const url = 'https://jsonplaceholder.typicode.com/users';
  const [userData, setUserData] = useAtom(userAtom);
  useEffect(() => {
    const fetchData = async (url) => {
      const response = await axios.get(url);
      setUserData(() => [...response.data]);
    };
    fetchData(url);
  }, []);
  return (
    <div>
      {userData.map((user) => {
        return <li key={user.id}>{user.name}</li>;
      })}
    </div>
  );
};

useHydrateAtomsを使って修正

こちらに書き換えるとチラ見えがなくなりました。

User.jsx(修正後)
import React from 'react';
import { useAtom } from 'jotai';
import { useHydrateAtoms } from 'jotai/utils';
import { userAtom } from '../atoms/usersAtom';
import axios from 'axios';

export const User = () => {
  const url = 'https://jsonplaceholder.typicode.com/users';
  const fetchData = async (url) => {
    const response = await axios.get(url);
    return response.data;
  };
  useHydrateAtoms([[userAtom, fetchData(url)]]);
  const [userData] = useAtom(userAtom)
  return (
    <div>
      {userData.map((user) => {
        return <li key={user.id}>{user.name}</li>;
      })}
    </div>
  );
};

コードの特徴

修正前

  • useAtomを使ってデータ呼び出し
  • useEffectを使う
    fetchしてAtomを書き換える非同期関数を宣言して実行

修正後

  • useAtomを使ってデータ呼び出しは後で。
  • useEffectは使わない
  • fetchしてデータを返す関数を宣言
  • useHydrateAtomsを実行
    リストを引数に入れる
    アトムとデータを入れる
  • ここでuseAtomを使ってデータを呼び出し。

感想

修正前のコードの書き方に慣れていたので、修正後のコードの書き方にはなかなか慣れませんでした。
でもコード量もそんなに変わらないので、慣れていこうかと思います。

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?