# Composition API de Vue 3: Guía completa para dominar la reactividad > Aprende a utilizar la Composition API de Vue 3 con esta guía práctica. Domina ref, reactive, computed, watch y composables para construir aplicaciones Vue de alto rendimiento. - Published: 2026-01-07 - Updated: 2026-04-06 - Author: SharpSkill - Tags: vue 3, composition api, javascript, frontend, reactivity - Reading time: 12 min --- La Composition API de Vue 3 representa una evolución importante en la forma de estructurar componentes Vue. Este enfoque organiza el código por funcionalidad en lugar de por opciones, lo que facilita la reutilización de lógica y el mantenimiento de aplicaciones complejas. > **Requisitos previos** > > Esta guía asume conocimientos básicos de Vue.js. Los ejemplos utilizan la sintaxis ` ``` Para objetos con múltiples propiedades relacionadas, `reactive` ofrece una sintaxis más natural sin necesidad de `.value`. ```javascript // UserProfile.vue ``` La regla general: utilizar `ref` para valores primitivos (string, number, boolean) y `reactive` para objetos estructurados. ## Computed Properties with computed Las propiedades computadas derivan valores a partir del estado reactivo. Se almacenan en caché y solo se recalculan cuando cambian sus dependencias, lo que las hace altamente eficientes. ```javascript // ProductList.vue ``` Las propiedades computadas también pueden ser de escritura mediante un getter y un setter, lo cual resulta útil para transformaciones bidireccionales. ```javascript // FullName.vue ``` ## Watchers with watch and watchEffect Los watchers ejecutan efectos secundarios en respuesta a cambios en los datos. Vue 3 ofrece dos enfoques: `watch` para un control preciso y `watchEffect` para un seguimiento automático. > **When to use watch vs watchEffect?** > > `watch` ofrece control preciso sobre las dependencias y proporciona tanto el valor anterior como el nuevo. `watchEffect` resulta más simple cuando todas las dependencias reactivas utilizadas deben disparar el efecto. ```javascript // SearchComponent.vue ``` Para observar objetos anidados o arreglos, la opción `deep` es necesaria con `watch`. ```javascript // DeepWatch.vue ``` ## Creating Reusable Composables Los composables son funciones que encapsulan lógica reactiva reutilizable. Este enfoque es una de las grandes fortalezas de la Composition API para compartir código entre componentes. ```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 } } ``` Este composable puede utilizarse de forma declarativa en cualquier componente. ```javascript // UserList.vue ``` A continuación, otro ejemplo de composable para gestionar el estado de un formulario con validación. ```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 } } ``` ## Lifecycle Hook Management La Composition API proporciona hooks de ciclo de vida como funciones que se invocan dentro de setup. Estos hooks permiten ejecutar código en momentos específicos del ciclo de vida del componente. > **Important Cleanup** > > Siempre se deben limpiar los efectos secundarios (timers, listeners de eventos, suscripciones) en `onUnmounted` para evitar fugas de memoria. ```javascript // LifecycleDemo.vue ``` ## Template Refs and DOM Access Los template refs proporcionan acceso directo a elementos del DOM o instancias de componentes hijos. Esto sigue siendo útil en casos donde la manipulación directa es necesaria. ```javascript // InputFocus.vue ``` ## Parent-Child Communication with Props and Emits La Composition API moderniza la declaración de props y eventos con `defineProps` y `defineEmits`, ofreciendo una mejor integración con TypeScript. ```javascript // ChildComponent.vue ``` ```javascript // ParentComponent.vue ``` ## Provide and Inject for Dependency Injection Para compartir datos entre componentes distantes sin necesidad de pasar props a través de cada nivel, Vue 3 ofrece `provide` e `inject`. ```javascript // App.vue (or an ancestor component) ``` ```javascript // DeepNestedComponent.vue (anywhere in the tree) ``` ## Conclusion La Composition API de Vue 3 ofrece un enfoque potente y flexible para organizar el código de aplicaciones Vue. Conceptos clave a recordar: - **ref** para valores primitivos, **reactive** para objetos complejos - **computed** para valores derivados con caché automático - **watch** y **watchEffect** para efectos secundarios reactivos - **Composables** para extraer y reutilizar lógica entre componentes - **Hooks de ciclo de vida funcionales** (`onMounted`, `onUnmounted`, etc.) - **provide/inject** para inyección de dependencias sin prop drilling Este enfoque facilita la creación de aplicaciones mantenibles y testeables, al mismo tiempo que ofrece una excelente integración con TypeScript. El siguiente paso consiste en explorar patrones avanzados como composables asíncronos y la integración con Pinia para la gestión de estado global. --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/es/blog/vue-nuxt/vue-3-composition-api-complete-guide