Communitygithub.com

padrões-vue

Padrões da Composition API do Vue.js 3, arquitetura de componentes, melhores práticas de reatividade, gerenciamento de estado Pinia, navegação Vue Router e padrões Nuxt SSR. Ativa para projetos Vue, Nuxt, Vite ou Pinia. Use ao construir ou revisar código Vue 3, Nuxt ou Pinia — Composition API, reatividade ou navegação de roteador.

O que é padrões-vue?

Este skill fornece um guia abrangente para desenvolvimento Vue.js 3 usando a Composition API (`<script setup>`), abrangendo design de componentes, reatividade, gerenciamento de estado com Pinia, roteamento com Vue Router, teste e padrões SSR com Nuxt. Ele é ativado automaticamente em projetos que usam Vue.js, Nuxt, Vite + Vue ou Pinia, fornecendo orientação contextualizada sempre que você trabalha com arquivos `.vue`, configura roteamento ou gerencia estado. O skill detalha uma estrutura de projeto feature-first, convenções de nomenclatura, boas práticas para props e eventos, criação de composables reutilizáveis e o uso de stores Pinia no estilo Setup Store. Também cobre padrões de template, otimizações de desempenho (como `shallowRef`, `v-memo`, lazy loading), testes com Vitest e Vue Test Utils, e as novas APIs do Vue 3.5+ como `useTemplateRef()`, `onWatcherCleanup()` e `useId()`. Para projetos Nuxt, oferece orientação sobre auto-imports, `useAsyncData`, `useFetch`, rotas de servidor e configuração de runtime. Inclui uma tabela de anti-padrões com correções para evitar armadilhas comuns.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/vue-patterns

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Padrões e Melhores Práticas Vue.js

Guia abrangente para desenvolvimento Vue.js 3 usando Composition API (<script setup>), cobrindo design de componentes, reatividade, gerenciamento de estado, roteamento, teste e padrões SSR. Orientações específicas do Nuxt são incluídas onde diferem do Vue puro.

Quando Ativar

Ative este skill quando:

  • O projeto usa Vue.js (qualquer versão), Nuxt, Vite + Vue ou Pinia.
  • O usuário pergunta sobre arquitetura de componentes Vue, composables, reatividade ou gerenciamento de estado.
  • Revisando Componentes de Arquivo Único Vue (arquivos .vue).
  • Configurando Vue Router, stores Pinia ou configuração Vite/Vitest.
  • Discutindo desempenho, segurança ou padrões SSR específicos do Vue.

1. Estrutura do Projeto

Layout Recomendado (Feature-First)

src/
├── api/              # Cliente de API e definições de endpoints
├── assets/           # Ativos estáticos (imagens, fontes, ícones)
├── components/       # Componentes compartilhados/reutilizáveis
│   ├── base/         # Primitivos de UI base (Button, Input, Modal)
│   └── features/     # Componentes compartilhados específicos de funcionalidades
├── composables/      # Lógica reutilizável da Composition API
├── layouts/          # Layouts de página (opcional)
├── pages/            # Componentes de página no nível de rota
├── router/           # Configuração do Vue Router
├── stores/           # Stores Pinia
├── types/            # Definições de tipo TypeScript
├── utils/            # Funções utilitárias puras
└── App.vue           # Componente raiz

Nomenclatura de Arquivos

ConvençãoQuando Usar
PascalCase.vueTodos os componentes (imposto por vue/multi-word-component-names)
useCamelCase.tsComposables
camelCase.tsUtilitários, clientes de API, tipos
Diretórios kebab-caseSegmentos de rota, pastas de funcionalidades

2. Arquitetura de Componentes

Ordem do Componente de Arquivo Único

<script setup lang="ts">
// 1. Imports (vue → ecossistema → absoluto → relativo)
// 2. Props & Emits & Slots
// 3. Composables
// 4. Estado local (ref/reactive)
// 5. Propriedades computadas
// 6. Métodos
// 7. Observadores
// 8. Hooks de ciclo de vida
</script>

<template>
  <!-- Conteúdo do template -->
</template>

<style scoped>
  /* Estilos escopados */
</style>

Apresentacional vs Container

  • Componentes container: Possuem busca de dados, estado e efeitos colaterais. Renderizam componentes apresentacionais.
  • Componentes apresentacionais: Recebem props, emitem eventos. Sem chamadas de API, sem acesso a store. Renderização pura.

Melhores Práticas de Props

// Props baseadas em tipos com valores padrão
interface Props {
  label: string;
  variant?: "primary" | "secondary";
  disabled?: boolean;
  items: Item[];
}

const props = withDefaults(defineProps<Props>(), {
  variant: "primary",
  disabled: false,
});
  • Sempre forneça type, e required/default quando apropriado.
  • Props booleanas: isXxx, hasXxx, canXxx.
  • Nunca mutar props — emita eventos.
  • Para vinculação v-model, use defineModel() (Vue 3.4+) ou modelValue + update:modelValue.

Eventos

const emit = defineEmits<{
  submit: [];
  "update:modelValue": [value: string];
  select: [id: string, index: number];
}>();
  • Use kebab-case em templates (@update:model-value).
  • Use camelCase no script (emit("update:modelValue", val)).

3. Composables (Lógica Reutilizável)

Estrutura

// composables/useDebounce.ts
export function useDebounce<T>(value: MaybeRef<T>, delay: number): Ref<T> {
  const debounced = ref(toValue(value)) as Ref<T>;

  let timer: ReturnType<typeof setTimeout>;
  watch(
    () => toValue(value),
    (newVal) => {
      clearTimeout(timer);
      timer = setTimeout(() => { debounced.value = newVal; }, delay);
    }
  );

  onUnmounted(() => clearTimeout(timer));
  return readonly(debounced);
}

Regras

  • Deve começar com prefixo use.
  • Retorne valores reativos (ref, computed, reactive), nunca primitivos simples.
  • Aceite entradas reativas via MaybeRef / toRef() / toValue().
  • Limpe efeitos colaterais em onUnmounted ou no onCleanup do observador.
  • Sem efeitos colaterais no escopo do módulo.

vs Mixins

Composables substituem completamente os mixins do Vue 2:

  • Mixins: Fluxo de dados opaco, colisões de fonte da verdade, conflitos de nome.
  • Composables: Imports explícitos, valores de retorno claros, combináveis e tree-shakable.

4. Gerenciamento de Estado

Quando Usar o Quê

PadrãoCaso de Uso
ref() / reactive()Estado local do componente
Props + EmitsComunicação pai-filho
Provide / InjectTema, configuração, API de plugin
Store PiniaEstado global, compartilhado, complexo
Composable de estado servidorDados de API com cache (envolva fetch/TanStack Query)

Store Pinia Setup (Preferida)

// stores/useCartStore.ts
export const useCartStore = defineStore("cart", () => {
  const items = ref<CartItem[]>([]);
  const isLoading = ref(false);

  const totalPrice = computed(() =>
    items.value.reduce((sum, i) => sum + i.price * i.quantity, 0)
  );
  const itemCount = computed(() =>
    items.value.reduce((sum, i) => sum + i.quantity, 0)
  );

  async function addItem(productId: string) {
    isLoading.value = true;
    try {
      const item = await fetchProduct(productId);
      const existing = items.value.find(i => i.id === item.id);
      if (existing) existing.quantity++;
      else items.value.push({ ...item, quantity: 1 });
    } finally {
      isLoading.value = false;
    }
  }

  return { items, isLoading, totalPrice, itemCount, addItem };
});
  • Use a sintaxe de Setup Store (não Options Store).
  • Prefira ações para mutações de nível de negócio e $patch() para atualizações agrupadas.
  • Toda ação assíncrona: trate carregamento + sucesso + erro.

5. Vue Router

Definições de Rota

const routes = [
  {
    path: "/users/:id",
    name: "user-detail",
    component: () => import("@/pages/UserDetail.vue"), // lazy
    props: true, // Passa params como props
    meta: { requiresAuth: true },
  },
];

Guards de Navegação

router.beforeEach((to, from) => {
  const { isLoggedIn } = useAuthStore();
  if (to.meta.requiresAuth && !isLoggedIn) {
    return { name: "login", query: { redirect: to.fullPath } };
  }
});

Parâmetros de Rota Reativos

Quando um componente permanece montado, mas os parâmetros de rota mudam:

const route = useRoute();
const id = computed(() => route.params.id as string);
watch(id, (newId) => fetchItem(newId));

6. Padrões de Template

Sintaxe de Template

<!-- v-if/v-else-if/v-else -->
<div v-if="isLoading">Carregando...</div>
<div v-else-if="error">Erro: {{ error }}</div>
<div v-else>{{ content }}</div>

<!-- v-show para alternâncias frequentes -->
<div v-show="isOpen">Conteúdo alternado</div>

<!-- v-for com chaves estáveis -->
<div v-for="item in items" :key="item.id">{{ item.name }}</div>

<!-- Lista filtrada computada (não v-if + v-for no mesmo elemento) -->
<div v-for="item in activeItems" :key="item.id">{{ item.name }}</div>

<!-- Manipulação de eventos -->
<form @submit.prevent="handleSubmit">
  <button type="submit">Salvar</button>
</form>

<!-- v-model -->
<input v-model="name" />
<CustomInput v-model="value" v-model:title="title" />

7. Desempenho

TécnicaQuando Usar
v-memoItens de lista que raramente mudam
v-onceConteúdo renderizado uma vez e estático para sempre
shallowRef()Grandes estruturas de dados substituídas por completo
shallowReactive()Apenas propriedades de nível superior são reativas
v-show sobre v-ifAlternâncias frequentes de visibilidade
<KeepAlive :max="10">Cache de visualizações alternadas
Rotas lazy() => import(...) para rotas não críticas
SuspenseCarregamento de componente assíncrono com fallback

8. Teste

Stack

  • Vitest para testes de unidade e componente
  • Vue Test Utils para montagem e interação
  • @pinia/testing para mock de store
  • Playwright para E2E

Padrão de Teste de Componente

import { mount } from "@vue/test-utils";
import { createPinia, setActivePinia } from "pinia";
import UserCard from "./UserCard.vue";

beforeEach(() => { setActivePinia(createPinia()); });

it("renderiza e emite", async () => {
  const wrapper = mount(UserCard, {
    props: { user: { id: "1", name: "Alice" } },
  });
  expect(wrapper.text()).toContain("Alice");
  await wrapper.find("button").trigger("click");
  expect(wrapper.emitted("select")![0]).toEqual(["1"]);
});

9. Padrões Específicos do Nuxt

Auto-Imports

Nuxt importa automaticamente ref, computed, watch, useFetch, useAsyncData, etc. Use-os diretamente sem importar. Para projetos não Nuxt, sempre importe explicitamente.

useAsyncData / useFetch

const { data: user, pending, error, refresh } = await useAsyncData(
  "user", // chave única para cache
  () => $fetch(`/api/users/${id}`),
);

const { data: posts } = await useFetch("/api/posts", {
  query: { page: 1 },
  key: "posts-page-1", // deduplica requisições
});

Rotas de Servidor

// server/api/users/[id].ts
export default defineEventHandler(async (event) => {
  const { id } = await getValidatedRouterParams(event, z.object({
    id: z.string().uuid(),
  }).parse);
  // ... buscar e retornar
});

Configuração de Runtime

// nuxt.config.ts
export default defineNuxtConfig({
  runtimeConfig: {
    // apenas servidor
    apiSecret: "",
    // público (exposto ao cliente)
    public: {
      apiBase: "https://api.example.com",
    },
  },
});

10. Novas APIs Vue 3.5+

Desestruturação Reativa de Props

Vue 3.5 estabilizou a desestruturação reativa de props — variáveis desestruturadas de defineProps() são automaticamente reativas:

// Vue 3.5+: props desestruturadas são reativas (sem necessidade de toRefs)
const { count = 0, msg = "olá" } = defineProps<{
  count?: number;
  msg?: string;
}>();

// Limitação: não é possível observar prop desestruturada diretamente
watch(() => count, (newVal) => { ... }); // PRECISA de getter

useTemplateRef()

Substitua refs simples correspondentes por nome com useTemplateRef() para referências de template:

import { useTemplateRef } from "vue";
const inputEl = useTemplateRef<HTMLInputElement>("input");
// "input" corresponde ao atributo ref="input" no template, não ao nome da variável

Suporta IDs de ref dinâmicos: useTemplateRef(dynamicRefId).

onWatcherCleanup()

API de limpeza de observador importável globalmente (Vue 3.5+). Deve ser chamada sincronamente dentro do callback do observador:

import { watch, onWatcherCleanup } from "vue";

watch(userId, async (newId) => {
  const controller = new AbortController();
  onWatcherCleanup(() => controller.abort());
  // ... buscar com sinal
});

useId()

Geração de ID único estável para SSR para elementos de formulário e acessibilidade:

import { useId } from "vue";
const id = useId();

defer Teleport

<Teleport defer> permite teletransportar para alvos renderizados no mesmo ciclo:

<Teleport defer to="#container">Conteúdo</Teleport>
<div id="container"></div>

Hidratação Lazy (SSR)

defineAsyncComponent() agora suporta estratégia hydrate:

import { defineAsyncComponent, hydrateOnVisible } from "vue";
const AsyncComp = defineAsyncComponent({
  loader: () => import("./Comp.vue"),
  hydrate: hydrateOnVisible(),
});

Anti-Padrões

Anti-PadrãoPor que está ErradoA Correção
Desestruturar defineProps() (Vue < 3.5)Captura snapshot, perde reatividadeAcesse via props.xxx ou use toRefs()
watch() em prop desestruturada (Vue 3.5+)Erro de compilação — props desestruturadas não podem ser observadas diretamenteUse wrapper getter: watch(() => count, ...)
v-if + v-for no mesmo elementoOrdem de execução ambíguaUse array filtrado computado
v-for key = índiceEstado quebrado ao reordenarUse IDs de banco de dados estáveis
Mutar propsViola fluxo de dados unidirecionalEmita eventos ou use v-model
v-html com conteúdo do usuárioVulnerabilidade XSSSanitize com DOMPurify
Mixins no Vue 3Opaco, propenso a colisõesSubstitua por composables
Efeitos colaterais no escopo do módulo em composableCompartilhado entre instânciasEscopo em onMounted + onUnmounted
reactive() para estado substituívelSubstituição quebra reatividadeUse ref()
Observador sem limpezaVazamentos de memória, condições de corridaUse onCleanup ou onWatcherCleanup() (Vue 3.5+)
Options API em novo código Vue 3Ecossistema migrando para Composition APIUse <script setup>
Ref simples para referências de templateSem suporte a ref dinâmico, correspondência de nome frágilUse useTemplateRef() (Vue 3.5+)

Skills Relacionados

  • accessibility — ARIA, HTML semântico, gerenciamento de foco
  • frontend-patterns — Arquitetura frontend entre frameworks
  • typescript — Melhores práticas TypeScript aplicadas a projetos Vue
  • coding-standards — Padrões gerais de qualidade de código

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

Habilidades Relacionadas