2 KiB
2 KiB
| type | name | description | scope | trigger | globs | updatedAt | |
|---|---|---|---|---|---|---|---|
| rule | estrutura-vue | Padrões obrigatórios de estrutura para componentes Vue 3 (defineComponent, setup, CSS, dispatch) | global | file_match |
|
2026-06-01 |
Regra: Estrutura de Componentes Vue
1. defineComponent obrigatório
Todo componente Vue deve usar defineComponent:
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
name: 'MeuComponente',
setup() {
// lógica aqui
}
})
</script>
2. setup() não pode ser externo
O setup() deve estar sempre dentro do .vue. Nunca delegar para arquivo externo.
// ❌ Proibido — setup esvaziado
export default defineComponent({
setup(props, { emit }) {
return useEliTabela(props, emit) // proxy vazio
}
})
// ✅ Correto — setup com lógica própria
export default defineComponent({
setup(props, { emit }) {
const estado = ref(null)
const carregar = async () => { ... }
return { estado, carregar }
}
})
Composables
use*.tspodem encapsular lógica reutilizável pontual, mas nunca substituir osetup(). Se ultrapassar 250 linhas → extrair subcomponentes, CSS ou Dispatch Table.
3. CSS co-localizado
Separação de estilos em arquivo externo quando o CSS contribui para o total de linhas:
MeuComponente.vue
MeuComponente.css
Importar via import './MeuComponente.css' ou <style src="./MeuComponente.css" />.
4. Dispatch Table
Uso de mapa de funções para eliminar if/else ou switch longos:
// handlers.ts
export const acaoHandlers: Record<string, () => void> = {
salvar: () => { ... },
cancelar: () => { ... },
excluir: () => { ... },
}
Impacto
Sem estes padrões, componentes perdem inferência de tipos, lógica fica inauditável em composables externos, e CSS cresce inline sem controle.
Referências
- Rule:
.agent/rules/limite-linhas.global.md - Rule:
.agent/rules/typescript-sem-any.global.md