# 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