useAtomによるAtomの読み書き
useAtom、useAtomValue、useSetAtomでコンポーネントツリー全体のAtomを読み取り、更新します
「useAtomによるAtomの読み書き」はCoddyKit上の無料React Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
useAtom:主要なフック
useAtom(someAtom)は、useState APIを踏襲した[value, setter]を返します。valueは現在のatomの状態で、setterはその状態を更新します。コンポーネントがatomの読み取りと書き込みの両方を行う場合に使用します。
setterには新しい値または更新関数を渡せます:setCount(c => c + 1)。
useAtomValue:読み取り専用アクセス
useAtomValue(someAtom)は現在の値だけを返し、setterは返しません。状態を読み取るだけで変更しない、表示専用のコンポーネントで使用します。
コンポーネントがsetterへの参照を保持しないため、コード上でも意図が明確になります。このコンポーネントは純粋な読み取り専用です。
useSetAtom:書き込み専用アクセス
useSetAtom(someAtom)はsetter関数だけを返します。重要なのは、コンポーネントがatomの値を購読しないことです。atomが変更されても、コンポーネントは再レンダリングされません。
状態の変更をディスパッチするものの、派生したUIを表示しないボタンのような、アクション専用のコンポーネントで使用します。
パフォーマンスにおけるuseSetAtomの重要性
useSetAtom(countAtom)を呼び出してカウンターを増加させるコンポーネントは、値の購読を持たないため、countAtomが変更されても再レンダリングされません。再レンダリングされるのは、countを表示するコンポーネントだけです。
これはシンプルですが強力な最適化です。書き込み側と読み取り側を分離して、連鎖的な再レンダリングを防ぎます。
atomWithStorageによる永続化
jotai/utilsからatomWithStorageをインポートします。atom()と同じように使用しますが、最初の引数としてストレージキーを渡します:atomWithStorage('theme', 'light')。atomはlocalStorageと自動的に同期します。
ページを再読み込みすると、atomはlocalStorageからハイドレーションされます。atomを読み取るすべてのコンポーネントが、永続化された値をすぐに取得します。
atomWithStorageのリセット
jotai/utilsのRESETシンボルを、atomWithStorageで作成したatomのsetterに渡せます:setter(RESET)。これによりlocalStorageのエントリが消去され、atomが初期値にリセットされます。
ログアウト処理や、設定ページの「デフォルトに戻す」ボタンで役立ちます。
atomFamilyによるatomファミリー
jotai/utilsのatomFamilyは、パラメーター化されたatomを返すファクトリを作成します。たとえば、atomFamily(id => atom(null))は、渡された一意のidごとに個別のatomを作成します。
selectedAtom(itemId)やexpandedAtom(rowId)のようなアイテムごとの状態に適しています。単一の大きなmap atomを管理する必要はありません。
atomファミリーのクリーンアップ
IDが蓄積すると、atomファミリーは際限なく増大する可能性があります。atomFamily.setShouldRemove((createdAt, param) => ...)を使用して、古くなったファミリーメンバーを削除するかJotaiが判断する際に使うクリーンアップ条件を定義します。
アイテムが追加・削除されるリストでは、メモリリークを防ぐため、アイテムの削除時にatomファミリーのエントリも必ずクリーンアップしてください。
Jotai DevTools
jotai-devtoolsパッケージは、アクティブなすべてのatomと現在の値を一覧表示するビジュアルパネルを提供します。インストールしてアプリをDevToolsでラップすると、atomの状態をリアルタイムで確認できます。
各atomの更新は変更前と変更後の値とともにログに記録されるため、複雑なatom間のやり取りも簡単にデバッグできます。
選択的な再レンダリングの例
大きなリストでは、ListContainerコンポーネントがuseSetAtom(selectedIdAtom)を使って、selectedIdAtomを購読せずに選択状態を更新できます。選択が変更されたときに再レンダリングされるのは、useAtomValue(selectedIdAtom)を呼び出す個々のListItemコンポーネントだけです。
このパターンは拡張性に優れています。リストアイテムを数千個追加しても、選択状態の更新が遅くなりません。
3つのフックの組み合わせ
コンポーネントの目的に合ったフックを選択します。純粋な表示にはuseAtomValue、純粋なアクションにはuseSetAtom、両方が必要な場合にはuseAtomを使用します。この意図的に設計されたAPIにより、コンポーネントの責務が一目で明確になります。
フォームフィールドのコンポーネントでは通常useAtomを使用し、送信ボタンではuseSetAtomを使用し、countを表示するラベルではuseAtomValueを使用します。
useSetAtomとuseAtom
useAtomの代わりにuseSetAtomを使用する主な利点は何ですか?
レッスンのおさらい
useAtomは値とsetterの両方を提供し、useAtomValueは値だけを提供して読み取り購読を行い、useSetAtomはsetterだけを提供して値の変更時には再レンダリングされません。atomWithStorageはRESETに対応しながらlocalStorageに値を永続化し、atomFamilyはパラメーターごとのatomを動的なリスト向けに作成します。
適切なフックを選ぶことで、不要な再レンダリングを最小限に抑え、コンポーネントの意図を明確にできます。
よくある質問
「useAtomによるAtomの読み書き」レッスンは無料ですか?
はい。「useAtomによるAtomの読み書き」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「useAtomによるAtomの読み書き」で何を学びますか?
useAtom、useAtomValue、useSetAtomでコンポーネントツリー全体のAtomを読み取り、更新します ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「useAtomによるAtomの読み書き」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Atoms:Jotaiにおける状態の単位
- useAtomによるAtomの読み書き
- 派生Atomと非同期Atom
- Jotai、Zustand、Contextの比較:使い分け