命令型APIと宣言型APIの使い分け
トレードオフを理解し、refや命令型ハンドルを使うべき場面を判断します。
「命令型APIと宣言型APIの使い分け」はCoddyKit上の無料React Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
Reactはデフォルトで宣言型
Reactは宣言型のスタイルを推奨します。ある状態に対してUIがどう見えるべきかを記述すると、ReactがDOMを一致するように調整します。ほとんどの動作は、DOMを直接操作するのではなく、propsと状態を通じて流れます。
このモデルでは、レンダリング結果が手動操作の連続によるものではなく、状態の純粋な関数になるため、UIを予測しやすくなります。
宣言型では不十分な場合
一部のインタラクションは、純粋な宣言型の表現にはなじみません。要素に命令型でフォーカスを移す、正確なタイミングでアニメーションを開始する、サードパーティ製のDOMウィジェットを操作するといった処理は、状態の関数としてきれいに表現できないことがあります。
このような場合に備えて、Reactはrefや命令型ハンドルなどのエスケープハッチを提供しています。ただし、宣言型のpropsでは対応しきれない場合に限って慎重に使用します。
命令型コードの代償
命令型APIにはトレードオフがあります。メソッドを実行して副作用を観測する必要があるためテストが難しく、Reactアプリを追いやすくしている一方向データフローを壊す可能性もあります。
また、命令型の呼び出しは、明確な状態からUIへの対応関係に動作を集約するのではなく、イベントハンドラー全体に動作を分散させがちです。その結果、保守のコストが増加します。
経験則
宣言型APIを優先し、命令型APIはインタラクションや計測のためにだけ使います。対象となるのは、フォーカス、スクロール、アニメーション、メディア再生、サイズや位置の読み取りなどです。
状態からレンダリング結果への対応としてモデル化できるものは、そうしてください。適切な状態として表現しにくい一時的なアクションであれば、命令型ハンドルが適しています。
宣言型モーダルと命令型モーダル
宣言型モーダルは親コンポーネントが管理するisOpen propに基づいてレンダリングされるため、表示状態は状態によって決まります。命令型モーダルはopenとcloseメソッドを公開し、自身の状態をハンドルの背後に隠します。
宣言型の実装はReactのデータフローに適しているため通常はこちらが推奨されます。一方、命令型の実装は、分散したイベント駆動コードから表示を開始する場合に便利です。
フォームのリセット:key propと命令型リセット
フォームのkey propを変更すると、Reactがフォームをデフォルト状態で新しく再マウントするため、宣言型にリセットできます。命令型の呼び出しは必要ありません。
命令型の方法では、ハンドルにresetメソッドを公開します。key propを使う方法は、手動で状態を消去するのではなくReactの再調整に任せるため、よりすっきりすることが多いです。
命令型の例としてのRouter Prefetch
Next.jsのrouterは、push、replace、prefetchなどの命令型メソッドを公開します。遷移しそうなルートを先にプリフェッチするのは、レンダリング状態の一部ではなくアクションなので、命令型の呼び出しが自然に適しています。
これは、処理が本質的に特定の時点で発生するアクションである場合、慣用的なReactツールでさえ命令型APIを使うことを示しています。
Refsはエスケープハッチ
公式のガイダンスでは、refと命令型ハンドルをエスケープハッチ、つまり本当に必要な場合に宣言型モデルの外へ出るためのツールとして位置付けています。機能を構築する際のデフォルトの方法ではありません。
この考え方を保つことで、エスケープハッチの使い過ぎを防げます。propsと状態では動作をきれいに表現できないことを確認してから、エスケープハッチを使います。
まとめのチェックリスト
命令型ハンドルを追加する前に、次のように考えます。これはUIに対応付けられた状態として表現できるか。できるなら宣言型にします。フォーカス、スクロール、計測、アニメーション、サードパーティ製ライブラリのアクションか。そうであれば、命令型が適切かもしれません。
さらに、公開するAPIが小さくドキュメント化されていること、propで渡せるデータを単に渡すためだけにrefを使っていないことも確認します。
両方のスタイルのバランス
実際のアプリケーションでは、両方のアプローチを組み合わせます。ロジックの大部分は宣言型のままにし、必要な一部のインタラクションにだけ薄い命令型ハンドルの層を設けます。
このバランスを取ることで、コードの予測しやすさとテストのしやすさを保ちながら、宣言型コードだけでは対応できないフォーカス管理、メディア制御、ライブラリ統合にも対応できます。
クイックチェック:宣言型と命令型
命令型APIが適切な手段となる場面を選びます。
まとめ:宣言型と命令型
Reactは、propsと状態によって駆動される宣言型UIをデフォルトとしています。これは予測しやすく、テストもしやすい設計です。命令型ハンドルは、フォーカス、スクロール、アニメーション、計測、サードパーティ製DOMの制御に対応するためのエスケープハッチです。
宣言型モーダルと命令型モーダルを比較し、フォームのリセットにはkey propを優先します。また、Next.jsのrouterでさえアクションに命令型メソッドを使うことを覚えておきましょう。命令型の層は小さく、ドキュメント化し、必要性を明確にしてください。
よくある質問
「命令型APIと宣言型APIの使い分け」レッスンは無料ですか?
はい。「命令型APIと宣言型APIの使い分け」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「命令型APIと宣言型APIの使い分け」で何を学びますか?
トレードオフを理解し、refや命令型ハンドルを使うべき場面を判断します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「命令型APIと宣言型APIの使い分け」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。