Vue 3 Composition API におけるコンポーネント機能の公開
Olivia Novak
Dev Intern · Leapcell

はじめに
現代のフロントエンド開発という活気あふれるエコシステムにおいて、コンポーネントベースのアーキテクチャは、スケーラブルで保守性の高いアプリケーションを構築するための礎となっています。Vue 3 は、その強力な Composition API により、コンポーネントロジックの構造化と管理の方法に革命をもたらし、再利用性と明示的な状態管理を重視しています。しかし、親コンポーネントが子コンポーネントの内部状態やメソッドとやり取りする必要があるという一般的なシナリオが発生します。プロップスとイベントはほとんどの親と子の通信を処理しますが、親が子の命令的な API や内部状態に直接アクセスする必要がある特定のケースがあります。まさにここで defineExpose が登場し、デフォルトのカプセル化を破り、コンポーネントの内部の特定の側面を公開するための、制御された意図的な方法を提供します。その目的と適切な使用法を理解することは、特に複雑なコンポーネントのやり取りを扱ったり、高度に再利用可能な UI ライブラリを構築したりする際に、堅牢で柔軟な Vue アプリケーションを作成するために不可欠です。
コンポーネントのカプセル化と defineExpose の理解
defineExpose を詳しく掘り下げる前に、Vue コンポーネントにおけるデフォルトのカプセル化について簡単に触れておきましょう。設計上、コンポーネントの内部状態(変数、リアクティブデータ、算出プロパティ)と <script setup> ブロック内で定義されたメソッドはプライベートです。これらは、プロップスを介して明示的に渡されるか、イベントを介して発行されない限り、親コンポーネントから直接アクセスできません。このカプセル化は、モジュール性を促進し、意図しない副作用を防ぐため、良いプラクティスです。
しかし、この厳格なカプセル化が障害となることがあります。命令的な focus() メソッドを必要とするカスタムフォーム入力コンポーネントや、親に open() および close() メソッドを公開する必要があるモーダルコンポーネントの構築を想像してみてください。そのようなシナリオでは、プロップスやイベントが煩雑になったり、直感的でなくなったりする可能性があります。ここで defineExpose がギャップを埋めます。
主要な用語
- Composition API: Vue 3 の API セットで、インポートされた関数を使用してコンポーネントロジックを合成できます。Options API と比較して、コードを整理および再利用するための、より柔軟で強力な方法を提供します。
 setupスクリプト: Vue Single File Component (SFC) 内で Composition API ロジックのエントリ ポイントです。すべてのリアクティブ状態、算出プロパティ、メソッド、ライフサイクルフックは通常ここで定義されます。ref: 値を保持するリアクティブな参照です。プリミティブ値(文字列、数値、ブール値)とオブジェクトの変更を追跡できます。provide/inject: プロップ ドリリングの回避メカニズムであり、各レベルでプロップスを手動で渡すことなく、コンポーネントツリー全体にデータを渡すことができます。データフローに関連していますが、defineExposeとは異なる目的を果たします。- コンポーネントインスタンス: DOM 内にマウントされたコンポーネントを表す実際の JavaScript オブジェクトです。親コンポーネントは、テンプレート ref を介して子コンポーネントインスタンスへの参照を取得できます。
 - テンプレート ref: テンプレート内のコンポーネントまたは HTML 要素の `ref=