Regras do Vue
As regras do Vue são regras de Patina em fila única. Eles inspecionam a estrutura do template SFC, a sintaxe das diretivas, a nomeação componentes e os riscos de correção específicos do Vue antes que o código chegue ao tempo de execução.
vue/require-v-for-key
Exige que todo v-for nó tenha uma chave estável.
Gravidade padrão: error
Presets: essential, happy-path, nuxt, opinionated
Ruim:
<template>
<li v-for="item in items">{{ item.name }}</li>
</template>
Bom:
<template>
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</template>
vue/no-use-v-if-with-v-for
Reporta um nó que v-if e v-for ao mesmo tempo. Filtrar um valor computado mantém a identidade da lista
estável e facilita a análise do modelo.
Gravidade padrão: warning
Presets: essential, happy-path, nuxt, opinionated
Ruim:
<template>
<li v-for="item in items" v-if="item.visible" :key="item.id">
{{ item.name }}
</li>
</template>
Bom:
<script setup lang="ts">
const visibleItems = computed(() => items.filter((item) => item.visible));
</script>
<template>
<li v-for="item in visibleItems" :key="item.id">
{{ item.name }}
</li>
</template>
vue/no-mutating-props
Relata para os adereços. O componente proprietário deve atualizar o valor por meio de um evento ou de um modelo binding.
Gravidade padrão: error
Presets: happy-path, nuxt, opinionated
Ruim:
<script setup lang="ts">
const props = defineProps<{ count: number }>();
props.count++;
</script>
Bom:
<script setup lang="ts">
const props = defineProps<{ count: number }>();
const emit = defineEmits<{ "update:count": [value: number] }>();
function increment() {
emit("update:count", props.count + 1);
}
</script>
vue/no-v-html
Reports v-html porque renderiza HTML bruto e pode transformar conteúdo controlado pelo usuário em um sumidouro XSS.
Gravidade padrão: warning
Presets: essential, happy-path, nuxt, opinionated
Ruim:
<template>
<article v-html="content" />
</template>
Bom:
<template>
<article>{{ content }}</article>
</template>
vue/no-child-content
Relata conteúdo filho sobre elementos que também usam v-html ou v-text. O Vue substitui as crianças em
tempo de execução, então o conteúdo criado é enganoso.
Gravidade padrão: error
Presets: essential, happy-path, nuxt, opinionated
Ruim:
<template>
<p v-text="message">Fallback text</p>
</template>
Bom:
<template>
<p v-text="message" />
</template>
vue/no-duplicate-attributes
Relata atributos duplicados no mesmo elemento.
Gravidade padrão: error
Presets: essential, happy-path, nuxt, opinionated
Ruim:
<template>
<button class="primary" class="large">Save</button>
</template>
Bom:
<template>
<button class="primary large">Save</button>
</template>
vue/no-dupe-v-else-if
Relata condições repetidas em uma cadeia de v-if / v-else-if .
Gravidade padrão: error
Presets: essential, happy-path, nuxt, opinionated
Ruim:
<template>
<p v-if="status === 'ready'">Ready</p>
<p v-else-if="status === 'ready'">Still ready</p>
</template>
Bom:
<template>
<p v-if="status === 'ready'">Ready</p>
<p v-else-if="status === 'loading'">Loading</p>
</template>
vue/no-template-shadow
Relatórios de variáveis modelo que ignoram variáveis de um escopo externo. Isso evita referências acidentais a um valor diferente do que o leitor espera.
Gravidade padrão: warning
Presets: nuxt, opinionated
Ruim:
<script setup lang="ts">
const item = ref("selected");
</script>
<template>
<p v-for="item in items" :key="item.id">{{ item.name }}</p>
</template>
Bom:
<script setup lang="ts">
const selectedItem = ref("selected");
</script>
<template>
<p v-for="item in items" :key="item.id">{{ item.name }}</p>
</template>
vue/no-unsafe-url
Relata vinculações de URL e atributos estáticos que podem se resolver em esquemas inseguros como
javascript:, vbscript:ou payloads executáveis data:.
Gravidade padrão: warning
Presets: essential, happy-path, nuxt, opinionated
Ruim:
<template>
<iframe src="javascript:alert(1)"></iframe>
<object data="data:text/html,<script>alert(1)</script>"></object>
<img srcset="/safe.png 1x, javascript:alert(1) 2x" />
<a :href="nextUrl">Continue</a>
</template>
Bom:
<script setup lang="ts">
const rawNextUrl = ref("/next");
const nextUrl = computed(() => {
return rawNextUrl.value.startsWith("/") ? rawNextUrl.value : "/";
});
</script>
<template>
<iframe src="/embedded/report" title="Report"></iframe>
<img srcset="/avatar.png 1x, /[email protected] 2x" />
<a :href="nextUrl">Continue</a>
</template>
vue/no-unused-components
Reporta componentes registrados localmente que nunca aparecem no modelo.
Gravidade padrão: warning
Presets: happy-path, nuxt, opinionated
Ruim:
<script setup lang="ts">
import UserAvatar from "./UserAvatar.vue";
</script>
<template>
<p>{{ user.name }}</p>
</template>
Bom:
<script setup lang="ts">
import UserAvatar from "./UserAvatar.vue";
</script>
<template>
<UserAvatar :user="user" />
</template>
vue/no-unused-properties
Relata os props declarados por defineProps que não são usados pelo componente.
Gravidade padrão: warning
Presets: happy-path, nuxt, opinionated
Ruim:
<script setup lang="ts">
defineProps<{ title: string; description: string }>();
</script>
<template>
<h1>{{ title }}</h1>
</template>
Bom:
<script setup lang="ts">
defineProps<{ title: string; description: string }>();
</script>
<template>
<h1>{{ title }}</h1>
<p>{{ description }}</p>
</template>
vue/require-component-is
Os relatórios <component> sem is vinculação.
Gravidade padrão: error
Presets: essential, happy-path, nuxt, opinionated
Ruim:
<template>
<component />
</template>
Bom:
<template>
<component :is="currentComponent" />
</template>
vue/use-unique-element-ids
Reporta IDs literais estáticos em locais onde useId() é mais seguro para reutilização de componentes e SSR.
Gravidade padrão: warning
Presets: nuxt, opinionated
Ruim:
<template>
<label for="email">Email</label>
<input id="email" />
</template>
Bom:
<script setup lang="ts">
const emailId = useId();
</script>
<template>
<label :for="emailId">Email</label>
<input :id="emailId" />
</template>
Regras de Sintaxe e Estilo
Essas regras não precisam de exemplos longos, mas ainda assim se comportam como regras de primeira classe e podem ser configuradas pelo nome.
vue/attribute-hyphenation impõe o estilo de nomeação de atributos em componentes personalizados. Padrão:
warning. Presets: happy-path, nuxt, opinionated.
vue/attribute-order impõe uma ordem de atributos estável. Padrão: warning. Presets:
happy-path, nuxt, opinionated.
vue/component-definition-name-casing impõe nomes de definição de componentes do PascalCase. Padrão:
warning. Presets: happy-path, nuxt, opinionated.
vue/component-name-in-template-casing aplica a inclusão de nomes de componentes em templates. Padrão:
warning. Presets: nuxt, opinionated.
vue/html-quotes impõe o estilo de aspas para atributos HTML. Padrão: warning. Presets:
happy-path, nuxt, opinionated.
vue/html-self-closing impõe um estilo de auto-fechamento. Padrão: warning. Presets: nuxt,
opinionated.
vue/multi-word-component-names exige que os nomes dos componentes contenham mais de uma palavra. Padrão:
error. Presets: essential, nuxt, opinionated.
vue/mustache-interpolation-spacing impõe espaçamento dentro da interpolação do bigode. Padrão:
warning. Presets: happy-path, nuxt, opinionated.
vue/no-boolean-attr-value não permite valores explícitos para atributos HTML booleanos. Padrão:
warning. Presets: nuxt, opinionated.
vue/no-inline-style desencoraja atributos de style em linha. Padrão: warning. Presets: nuxt,
opinionated.
vue/no-lone-template proíbe embalagens <template> desnecessárias. Padrão: warning. Presets:
happy-path, nuxt, opinionated.
vue/no-multi-spaces proíbe espaços repetidos em templates. Padrão: warning. Presets:
happy-path, nuxt, opinionated.
vue/no-preprocessor-lang desencoraja linguagens de pré-processador CSS em blocos SFC. Padrão: warning.
Presets: nuxt, opinionated.
vue/no-reserved-component-names não permite nomes reservados de HTML ou Vue como nomes de componentes. Padrão:
error. Presets: essential, happy-path, nuxt, opinionated.
vue/no-script-non-standard-lang desencoraja linguagens de script não padrão. Padrão: warning.
Presets: nuxt, opinionated.
vue/no-src-attribute desencoraja atributos externos de src nos blocos SFC. Padrão: warning.
Presets: nuxt, opinionated.
vue/no-template-key proíbe key <template>. Padrão: error. Presets: essential,
happy-path, nuxt, opinionated.
vue/no-template-lang desencoraja lang em <template>. Padrão: warning. Presets: nuxt,
opinionated.
vue/no-textarea-mustache impede a interpolação do bigode dentro <textarea>. Padrão: error.
Presets: essential, happy-path, nuxt, opinionated.
vue/no-unused-vars reporta variáveis não utilizadas introduzidas por v-for e v-slot. Padrão:
warning. Presets: essential, happy-path, nuxt, opinionated.
vue/no-useless-template-attributes desabilita atributos em <template> que o Vue ignora. Padrão:
error. Presets: essential, happy-path, nuxt, opinionated.
vue/no-v-text-v-html-on-component não permite v-text ou v-html sobre elementos componentes. Padrão:
error. Presets: essential, happy-path, nuxt, opinionated.
vue/permitted-contents aplica regras de modelos de conteúdo HTML dentro dos templates do Vue. Padrão: error.
Presets: happy-path, nuxt, opinionated.
vue/prefer-props-shorthand recomenda sintaxe abreviada para adereços. Padrão: warning. Presets:
nuxt, opinionated.
vue/prop-name-casing impõe nomes de adereços de caixas de kebab nos modelos. Padrão: warning. Presets:
happy-path, nuxt, opinionated.
vue/require-component-registration requer importação ou registro explícito de componentes. Padrão:
warning. Presets: opinionated.
vue/require-scoped-style exige scoped em blocos no estilo SFC. Padrão: warning. Presets:
happy-path, nuxt, opinionated.
vue/scoped-event-names recomenda nomes de eventos com escopo, como form:submit. Padrão: warning.
Presets: nuxt, opinionated.
vue/sfc-element-order impõe a ordem dos blocos SFC de nível superior. Padrão: warning. Presets:
happy-path, nuxt, opinionated.
vue/single-style-block recomenda manter os estilos em um único bloco. Padrão: warning. Presets:
happy-path, nuxt, opinionated.
vue/use-v-on-exact impõe .exact quando manipuladores baseados em modificadores coexistem. Padrão: warning.
Presets: essential, nuxt, opinionated.
vue/v-bind-style, vue/v-on-stylee vue/v-slot-style impõem preferências de estilo diretivo.
Padrão: warning. Presets: nuxt e/ou happy-path, mais opinionated.
vue/valid-attribute-name, vue/valid-v-bind, vue/valid-v-else, vue/valid-v-for,
vue/valid-v-if, vue/valid-v-memo, vue/valid-v-model, vue/valid-v-on, vue/valid-v-show,
e vue/valid-v-slot reportam a sintaxe inválida da diretiva do Vue. Padrão: error. Presets:
essential, happy-path, nuxt, opinionated.
vue/warn-custom-block e vue/warn-custom-directive alertam sobre pontos de extensão personalizados do Vue que
precisam de suporte ou registro de hosts. Padrão: warning. Presets: nuxt, opinionated.