派生Atomと非同期Atom
他のAtomから派生Atomを組み合わせ、Suspenseと連携する非同期Atomを作成します
「派生Atomと非同期Atom」はCoddyKit上の無料React Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
読み取り専用の派生atom
getter関数を渡して派生atomを作成します:const doubleAtom = atom(get => get(countAtom) * 2)。このatomは値を保持せず、countAtomが変更されるたびに再計算されます。
派生atomは手動で同期しなくても常に最新の状態になります。Jotaiにおけるcomputed propertyに相当します。
依存関係の自動追跡
Jotaiはgetter関数内でアクセスされたatomを追跡し、そのいずれかが変更されると派生atomを自動的に再評価します。依存関係を明示的に宣言する必要はありません。
getterがget(atomA)とget(atomB)を呼び出す場合、atomAまたはatomBのどちらかが変更されると派生atomが更新されます。
書き込み可能な派生atom
書き込み可能な派生atomにはgetterとsetterの両方があります:atom(get => get(baseAtom).toUpperCase(), (get, set, newValue) => set(baseAtom, newValue.toLowerCase()))。読み取り時には変換された値を返し、書き込み時には変換して保存します。
このパターンにより、base atomを直接公開せずに双方向のデータ変換を実装できます。
Promiseを使った非同期atom
getter関数は非同期にもできます:const userAtom = atom(async get => { const id = get(userIdAtom); return await fetchUser(id); })。Jotaiはatomのgetterから返されるPromiseをそのまま受け入れます。
userIdAtomが変更されると、Jotaiは非同期getterを自動的に再実行し、データ取得中は使用側のコンポーネントをサスペンドします。
非同期atomとReact Suspense
非同期atomはReact Suspenseとシームレスに連携します。使用側のコンポーネントをfallback付きのSuspense境界でラップします。Promiseが保留中の間はコンポーネントがサスペンドし、解決されるとレンダリングされます。
これにより、コンポーネントでローディング状態を手動管理する必要がなくなります。isLoadingフラグも、データ取得のためのuseEffectも不要です。
loadable:Suspenseを使わない方法
jotai/utilsからloadableをインポートします。非同期atomをラップします:const loadableUserAtom = loadable(userAtom)。loadableUserAtomを読み取るコンポーネントは、サスペンドすることなく、{state: 'loading'}、{state: 'hasData', data: user}、または{state: 'hasError', error}を受け取ります。
Suspense境界に依存せず、インラインでカスタムのローディング状態を表示する必要がある場合にloadableを使用します。
atomのリセット
jotai/utilsのatomWithResetユーティリティは、RESETシンボルを使って初期値にリセットできるatomを作成します。初期値を手動で追跡して再適用するよりも、すっきりと実装できます。
フォームでは、送信またはキャンセル時に、1つのハンドラー内で各setterにRESETを渡してすべてのフィールドatomをリセットできます。
atomの連結
派生atomは複数のatomから読み取れます:const summaryAtom = atom(get => ({ user: get(userAtom), settings: get(settingsAtom), count: get(countAtom) }))。これにより、いずれかの依存関係が変更されると更新される、単一の安定した参照が作成されます。
summaryだけが必要なコンポーネントは、3つの個別のatomすべてを購読するのではなく、summaryAtomを購読できます。
条件付きatom
派生atomは条件に応じて異なるatomを読み取れます:const activeDataAtom = atom(get => get(modeAtom) === 'A' ? get(dataAAtom) : get(dataBAtom))。modeAtomが切り替わると、派生atomはデータソースを自動的に切り替えます。
Jotaiは評価のたびに正しいatomを再購読するため、非アクティブな分岐の古いデータが残りません。
非同期atomのエラーハンドリング
非同期atomのgetterが例外をスローするかrejectされた場合、Suspenseとともに使用すると、エラーは最も近いReactのエラーバウンダリに伝播します。loadableを使用する場合は、インラインで処理できるよう、エラーがstate.errorフィールドに現れます。
本番コードでは、非同期atomには必ずErrorBoundaryまたはloadableラッパーのいずれかを組み合わせてください。
派生atomのパフォーマンス
派生atomは直前の結果をメモ化します。すべての依存atomが前回の評価と同じ値を返す場合、派生atomは同じ参照を返すため、下流の再レンダリングは発生しません。
大規模な配列変換など計算コストの高い派生処理では、追加設定なしでこのメモ化による大きなパフォーマンス上のメリットが得られます。
非同期atomとSuspenseの連携
Promiseが保留中の間、非同期atomを読み取るコンポーネントはどうなりますか?
レッスンのおさらい
派生atomは、getter関数と依存関係の自動追跡を使って、他のatomから値を計算します。非同期atomは非同期getterを使用し、デフォルトでReact Suspenseと連携します。Suspenseを使わずにローディング状態やエラー状態をインラインで処理するには、jotai/utilsのloadableを使用します。
書き込み可能な派生atomでは双方向の変換が可能になり、条件付きatomでは他のatomの値に基づいてデータソースを動的に切り替えられます。
よくある質問
「派生Atomと非同期Atom」レッスンは無料ですか?
はい。「派生Atomと非同期Atom」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「派生Atomと非同期Atom」で何を学びますか?
他のAtomから派生Atomを組み合わせ、Suspenseと連携する非同期Atomを作成します ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「派生Atomと非同期Atom」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。