# Composition API do Vue 3: Guia completo para dominar a reatividade > Aprenda a utilizar a Composition API do Vue 3 com este guia prático. Domine ref, reactive, computed, watch e composables para construir aplicações Vue de alto desempenho. - Published: 2026-01-07 - Updated: 2026-04-06 - Author: SharpSkill - Tags: vue 3, composition api, javascript, frontend, reactivity - Reading time: 12 min --- A Composition API do Vue 3 representa uma evolução significativa na forma de estruturar componentes Vue. Essa abordagem organiza o código por funcionalidade em vez de por opções, facilitando a reutilização de lógica e a manutenção de aplicações complexas. > **Pré-requisitos** > > Este guia pressupõe conhecimentos básicos de Vue.js. Os exemplos utilizam a sintaxe ` ``` Para objetos com múltiplas propriedades relacionadas, `reactive` oferece uma sintaxe mais natural, sem a necessidade de `.value`. ```javascript // UserProfile.vue ``` A regra geral: utilizar `ref` para valores primitivos (string, number, boolean) e `reactive` para objetos estruturados. ## Computed Properties with computed Propriedades computadas derivam valores a partir do estado reativo. São armazenadas em cache e só recalculam quando suas dependências mudam, o que as torna altamente performáticas. ```javascript // ProductList.vue ``` Propriedades computadas também podem ser de escrita, utilizando um getter e um setter. Isso é útil para transformações bidirecionais. ```javascript // FullName.vue ``` ## Watchers with watch and watchEffect Os watchers executam efeitos colaterais em resposta a mudanças nos dados. O Vue 3 oferece duas abordagens: `watch` para controle preciso e `watchEffect` para rastreamento automático. > **When to use watch vs watchEffect?** > > `watch` oferece controle preciso sobre as dependências e fornece tanto o valor anterior quanto o novo. `watchEffect` é mais simples quando todas as dependências reativas utilizadas devem disparar o efeito. ```javascript // SearchComponent.vue ``` Para observar objetos aninhados ou arrays, a opção `deep` é necessária com `watch`. ```javascript // DeepWatch.vue ``` ## Creating Reusable Composables Composables são funções que encapsulam lógica reativa reutilizável. Essa abordagem é um dos grandes pontos fortes da Composition API para compartilhar 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 } } ``` Esse composable pode ser utilizado de forma declarativa em qualquer componente. ```javascript // UserList.vue ``` A seguir, outro exemplo de composable para gerenciar o estado de um formulário com validação. ```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 A Composition API disponibiliza hooks de ciclo de vida como funções chamadas dentro do setup. Esses hooks permitem executar código em momentos específicos do ciclo de vida do componente. > **Important Cleanup** > > Sempre limpe os efeitos colaterais (timers, listeners de eventos, assinaturas) em `onUnmounted` para evitar vazamentos de memória. ```javascript // LifecycleDemo.vue ``` ## Template Refs and DOM Access Os template refs fornecem acesso direto a elementos do DOM ou instâncias de componentes filhos. Isso continua sendo útil em casos onde a manipulação direta é necessária. ```javascript // InputFocus.vue ``` ## Parent-Child Communication with Props and Emits A Composition API moderniza a declaração de props e eventos com `defineProps` e `defineEmits`, oferecendo uma integração superior com TypeScript. ```javascript // ChildComponent.vue ``` ```javascript // ParentComponent.vue ``` ## Provide and Inject for Dependency Injection Para compartilhar dados entre componentes distantes sem a necessidade de passar props por cada nível, o Vue 3 oferece `provide` e `inject`. ```javascript // App.vue (or an ancestor component) ``` ```javascript // DeepNestedComponent.vue (anywhere in the tree) ``` ## Conclusion A Composition API do Vue 3 oferece uma abordagem poderosa e flexível para organizar o código de aplicações Vue. Conceitos-chave a reter: - **ref** para valores primitivos, **reactive** para objetos complexos - **computed** para valores derivados com cache automático - **watch** e **watchEffect** para efeitos colaterais reativos - **Composables** para extrair e reutilizar lógica entre componentes - **Hooks de ciclo de vida funcionais** (`onMounted`, `onUnmounted`, etc.) - **provide/inject** para injeção de dependências sem prop drilling Essa abordagem facilita a criação de aplicações sustentáveis e testáveis, ao mesmo tempo em que oferece excelente integração com TypeScript. O próximo passo envolve explorar padrões avançados como composables assíncronos e a integração com Pinia para gerenciamento de estado global. --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/pt/blog/vue-nuxt/vue-3-composition-api-complete-guide