--- id: wiki-20260508-composition-api-redir title: Composition API category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Vue Composition API, setup()] duplicate_of: none source_trust_level: A confidence_score: 0.95 verification_status: applied tags: [vue, reactivity, frontend] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: TypeScript framework: Vue 3 --- # Composition API ## 매 한 줄 > **"매 logic-by-feature, not-by-option"**. 매 Vue 2 의 Options API (data/computed/methods 의 monolithic blob) 의 limitation 매 large component 의 reuse 의 difficulty → 매 Vue 3 (2020) 의 setup-function-based, ref/reactive primitive, custom-composables 의 pattern. ## 매 핵심 ### 매 primitives - `ref(initial)` — 매 single value reactive container, `.value` access. - `reactive(obj)` — 매 deep proxy 의 object. - `computed(() => ...)` — 매 lazy + cached derived. - `watch(source, cb)` — 매 reactive side-effect. - `watchEffect(cb)` — 매 auto-track dependencies. ### 매 modern (Vue 3.4+ / 2026) - ` ``` ### Custom composable ```ts // useCounter.ts import { ref, computed } from 'vue'; export function useCounter(initial = 0, step = 1) { const count = ref(initial); const double = computed(() => count.value * 2); const inc = () => (count.value += step); const reset = () => (count.value = initial); return { count, double, inc, reset }; } ``` ### Async data with `useFetch` (VueUse) ```ts import { useFetch } from '@vueuse/core'; const { data, error, isFetching } = useFetch('/api/users').json(); ``` ### `defineModel` (Vue 3.4) ```vue ``` ### `watch` + `watchEffect` ```ts import { watch, watchEffect } from 'vue'; watch(count, (v, old) => console.log('count', old, '→', v)); watchEffect(() => console.log('auto-tracks', count.value)); ``` ### Provide/Inject typed ```ts // parent import { provide } from 'vue'; import type { InjectionKey } from 'vue'; const ThemeKey: InjectionKey> = Symbol(); provide(ThemeKey, theme); // child import { inject } from 'vue'; const theme = inject(ThemeKey, ref('light')); ``` ## 매 결정 기준 | 상황 | API | |---|---| | Vue 2 legacy | Options API | | Vue 3 new code | Composition API + `