# Vue 3 — Composition API Best Practices > Extraído de skills: `vue` + `vue-composition-api-best-practices` ## ` ``` ## Composables — `useXxx` Pattern ```ts // composables/usePagination.ts export function usePagination(items: T[], pageSize = 20) { const page = ref(1) const totalPages = computed(() => Math.ceil(items.value.length / pageSize)) const paginated = computed(() => items.value.slice((page.value - 1) * pageSize, page.value * pageSize) ) return { page, totalPages, paginated } } ``` ## ``` ## State Management — Pinia ```ts // stores/counter.ts import { defineStore } from 'pinia' import { ref, computed } from 'vue' export const useCounterStore = defineStore('counter', () => { const count = ref(0) const double = computed(() => count.value * 2) function increment() { count.value++ } return { count, double, increment } }) ``` ## Reactividade — Principais Armadilhas - `ref` vs `reactive`: use `ref` por padrão (tipagem simples); `reactive` para objetos grandes - Perda de reatividade ao desestruturar — usar `toRefs()` ou `storeToRefs()` - `watch` vs `watchEffect`: `watch` é mais controlado; `watchEffect` é automático mas menos previsível - `v-if` vs `v-show`: `v-if` remove do DOM; `v-show` togglea `display` ## Type-Safe Vue ```vue ``` ## Vue Router Traps - `useRoute()` para rota atual — reativa, usar em setup - `useRouter()` para navegação — `router.push('/path')` - Guards: `beforeEach`, `beforeResolve`, `afterEach` — retornar `false` cancela - `` com named views — múltiplas views por rota ## Common Mistakes - `key` em `v-for` é obrigatório — `v-for="item in items" :key="item.id"` - Ordem de event modifiers importa — `.prevent.stop` ≠ `.stop.prevent` - `Teleport` para modais — `` renderiza fora da árvore