# Vue 3 Composition API 完全ガイド:リアクティビティを使いこなす > Vue 3 Composition APIの実践ガイドです。ref、reactive、computed、watch、コンポーザブルを学び、高性能なVueアプリケーションを構築しましょう。 - Published: 2026-01-07 - Updated: 2026-04-06 - Author: SharpSkill - Tags: vue 3, composition api, javascript, frontend, reactivity - Reading time: 12 min --- Vue 3のComposition APIは、Vueコンポーネントの設計方法に大きな変革をもたらしました。オプション単位ではなく機能単位でコードを整理できるため、ロジックの再利用や複雑なアプリケーションの保守が格段に容易になります。 > **前提知識** > > このガイドはVue.jsの基礎知識があることを前提としています。各サンプルではVue 3.2で導入された` ``` 関連するプロパティが複数あるオブジェクトには、`reactive`がより自然な構文を提供します。`.value`は不要です。 ```javascript // UserProfile.vue ``` 基本的な使い分けは次のとおりです。プリミティブ値(文字列、数値、真偽値)には`ref`を、構造化されたオブジェクトには`reactive`を使用します。 ## computedによる算出プロパティ 算出プロパティはリアクティブな状態から値を導出します。キャッシュが効くため、依存するデータが変更されたときだけ再計算され、高いパフォーマンスを発揮します。 ```javascript // ProductList.vue ``` 算出プロパティはgetterとsetterを組み合わせることで書き込み可能にもなります。双方向の変換が必要な場面で役立ちます。 ```javascript // FullName.vue ``` ## watchとwatchEffectによるウォッチャー ウォッチャーはデータの変更に応じて副作用を実行します。Vue 3には2つのアプローチがあります。精密に制御できる`watch`と、依存関係を自動追跡する`watchEffect`です。 > **watchとwatchEffectの使い分け** > > `watch`は依存関係を明示的に指定でき、変更前後の値を取得できます。`watchEffect`は、使用しているすべてのリアクティブな依存関係で自動的に実行されるため、シンプルに書けます。 ```javascript // SearchComponent.vue ``` ネストされたオブジェクトや配列を監視するには、`watch`で`deep`オプションを指定する必要があります。 ```javascript // DeepWatch.vue ``` ## 再利用可能なコンポーザブルの作成 コンポーザブルとは、再利用可能なリアクティブロジックをカプセル化する関数です。コンポーネント間でコードを共有するうえで、Composition APIの最大の強みの一つです。 ```javascript // composables/useFetch.js import { ref, watchEffect, toValue } from 'vue' // Composable for HTTP requests // Automatically handles loading, errors, and refetching export function useFetch(url) { const data = ref(null) const error = ref(null) const isLoading = ref(false) // Reusable fetch function async function fetchData() { isLoading.value = true error.value = null try { // toValue() allows accepting a ref or a value const response = await fetch(toValue(url)) if (!response.ok) { throw new Error(`HTTP ${response.status}`) } data.value = await response.json() } catch (e) { error.value = e.message } finally { isLoading.value = false } } // watchEffect for automatic refetch if url is a ref watchEffect(() => { fetchData() }) // Expose state and methods return { data, error, isLoading, refetch: fetchData } } ``` このコンポーザブルを使えば、任意のコンポーネントで宣言的にデータ取得を実装できます。 ```javascript // UserList.vue ``` 次は、バリデーション付きのフォーム状態を管理するコンポーザブルの例です。 ```javascript // composables/useForm.js import { reactive, computed } from 'vue' // Form management composable export function useForm(initialValues, validationRules) { // Form state const form = reactive({ values: { ...initialValues }, errors: {}, touched: {} }) // Validate a specific field const validateField = (field) => { const rules = validationRules[field] if (!rules) return true for (const rule of rules) { const result = rule(form.values[field]) if (result !== true) { form.errors[field] = result return false } } form.errors[field] = null return true } // Validate entire form const validate = () => { let isValid = true for (const field in validationRules) { if (!validateField(field)) { isValid = false } } return isValid } // computed: form is valid if no errors const isValid = computed(() => { return Object.values(form.errors).every(e => !e) }) // Mark a field as touched (to display errors) const touch = (field) => { form.touched[field] = true validateField(field) } // Reset the form const reset = () => { form.values = { ...initialValues } form.errors = {} form.touched = {} } return { form, isValid, validate, validateField, touch, reset } } ``` ## ライフサイクルフックの管理 Composition APIでは、ライフサイクルフックをsetup内で呼び出す関数として提供しています。コンポーネントのライフサイクルの特定のタイミングでコードを実行できます。 > **クリーンアップの重要性** > > メモリリークを防ぐため、`onUnmounted`でタイマー、イベントリスナー、サブスクリプションなどの副作用を必ずクリーンアップしてください。 ```javascript // LifecycleDemo.vue ``` ## テンプレート参照とDOMアクセス テンプレート参照を使うと、DOM要素や子コンポーネントのインスタンスに直接アクセスできます。直接操作が必要なケースで引き続き有用です。 ```javascript // InputFocus.vue ``` ## PropsとEmitsによる親子間コミュニケーション Composition APIでは、`defineProps`と`defineEmits`を使ってpropsとイベントの宣言を刷新しています。TypeScriptとの統合も優れています。 ```javascript // ChildComponent.vue ``` ```javascript // ParentComponent.vue ``` ## Provideとinjectによる依存性注入 プロップスのバケツリレー(prop drilling)を避けて離れたコンポーネント間でデータを共有するために、Vue 3は`provide`と`inject`を提供しています。 ```javascript // App.vue (or an ancestor component) ``` ```javascript // DeepNestedComponent.vue (anywhere in the tree) ``` ## まとめ Vue 3のComposition APIは、Vueアプリケーションのコードを整理するための強力かつ柔軟なアプローチを提供します。押さえておくべきポイントは以下のとおりです。 - **ref** はプリミティブ値に、**reactive** は複雑なオブジェクトに使用する - **computed** で自動キャッシュ付きの派生値を定義する - **watch** と **watchEffect** でリアクティブな副作用を管理する - **コンポーザブル** でコンポーネント間のロジックを抽出・再利用する - **関数型ライフサイクルフック**(`onMounted`、`onUnmounted` など)を活用する - **provide/inject** でプロップスのバケツリレーなしに依存性注入を行う このアプローチにより、保守性とテスト容易性に優れたアプリケーションを構築しながら、TypeScriptとの優れた統合も実現できます。次のステップとして、非同期コンポーザブルやPiniaを使ったグローバルステート管理などの高度なパターンを探求してみてください。 --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/ja/blog/vue-nuxt/vue-3-composition-api-complete-guide