Regras Vue
Cada regra Vue reúne nesta página sua finalidade, configuração e exemplos incorreto e correto. As linhas destacadas mostram a alteração; o código copiado preserva o conteúdo completo.
| Regra | Exemplos | Finalidade |
|---|---|---|
vue/a11y-img-alt |
Incorreto · Correto | Exigir o atributo alt nas imagens para garantir acessibilidade |
vue/attribute-hyphenation |
Incorreto · Correto | Aplicar um padrão de nomes de atributos em componentes personalizados |
vue/attribute-order |
Incorreto · Correto | Aplicar uma ordem consistente aos atributos |
vue/component-definition-name-casing |
Incorreto · Correto | Exigir PascalCase ou kebab-case nos nomes de definição de componentes |
vue/component-name-in-template-casing |
Incorreto · Correto | Aplicar um padrão específico de maiúsculas e minúsculas aos nomes de componentes nos templates |
vue/html-button-has-type |
Incorreto · Correto | Exigir um type explícito e válido nos elementos button |
vue/html-quotes |
Incorreto · Correto | Aplicar um padrão de aspas aos atributos HTML |
vue/html-self-closing |
Incorreto · Correto | Aplicar um padrão de tags com fechamento automático |
vue/max-template-complexity |
Incorreto · Correto | Limitar a complexidade do próprio template de um componente, tanto ciclomática quanto cognitiva |
vue/multi-word-component-names |
Incorreto · Correto | Exigir nomes de componentes com mais de uma palavra |
vue/mustache-interpolation-spacing |
Incorreto · Correto | Aplicar espaçamento consistente dentro das interpolações com chaves duplas |
vue/no-array-index-key |
Incorreto · Correto | Proibir o uso direto da variável de índice de v-for como :key |
vue/no-bare-strings-in-template |
Incorreto · Correto | Proibir texto legível por pessoas diretamente no template quando ele deve ser internacionalizado |
vue/no-boolean-attr-value |
Incorreto · Correto | Proibir valores explícitos em atributos HTML booleanos |
vue/no-child-content |
Incorreto · Correto | Proibir conteúdo filho ao usar v-html ou v-text |
vue/no-deprecated-filter |
Incorreto · Correto | Proibir a sintaxe obsoleta de filtros do Vue 2 com o operador de barra vertical |
vue/no-deprecated-functional-template |
Incorreto · Correto | Proibir o atributo functional no <template> de um SFC |
vue/no-deprecated-html-element-is |
Incorreto · Correto | Proibir o atributo is em elementos HTML nativos |
vue/no-deprecated-inline-template |
Incorreto · Correto | Proibir o atributo obsoleto inline-template |
vue/no-deprecated-router-link-tag-prop |
Incorreto · Correto | Proibir a prop tag em <router-link> |
vue/no-deprecated-scope-attribute |
Incorreto · Correto | Proibir o atributo obsoleto scope em <template> |
vue/no-deprecated-slot-attribute |
Incorreto · Correto | Proibir o atributo obsoleto slot |
vue/no-deprecated-slot-scope-attribute |
Incorreto · Correto | Proibir o atributo obsoleto slot-scope |
vue/no-deprecated-v-bind-sync |
Incorreto · Correto | Proibir o modificador obsoleto .sync em v-bind |
vue/no-deprecated-v-is |
Incorreto · Correto | Proibir a diretiva obsoleta v-is |
vue/no-deprecated-v-on-native-modifier |
Incorreto · Correto | Proibir o modificador obsoleto .native em v-on |
vue/no-deprecated-v-on-number-modifiers |
Incorreto · Correto | Proibir modificadores numéricos obsoletos de keyCode em v-on |
vue/no-dupe-v-else-if |
Incorreto · Correto | Proibir condições duplicadas em cadeias de v-if / v-else-if |
vue/no-duplicate-attributes |
Incorreto · Correto | Proibir atributos duplicados no mesmo elemento |
vue/no-empty-component-block |
Incorreto · Correto | Proibir blocos vazios em SFCs |
vue/no-inline-style |
Incorreto · Correto | Desencorajar o uso de atributos de estilo inline |
vue/no-invalid-html-attribute |
Incorreto · Correto | Proibir valores estáticos inválidos para atributos HTML |
vue/no-lone-template |
Incorreto · Correto | Proibir elementos <template> desnecessários |
vue/no-multi-spaces |
Incorreto · Correto | Proibir vários espaços consecutivos |
vue/no-multiple-objects-in-class |
Incorreto · Correto | Proibir vários objetos literais dentro de uma vinculação de array em :class |
vue/no-multiple-template-root |
Incorreto · Correto | Proibir vários nós raiz em um template |
vue/no-mutating-props |
Incorreto · Correto | Proibir a mutação de props de componentes |
vue/no-negated-v-if-condition |
Incorreto · Correto | Proibir uma condição negada em v-if quando a cadeia tiver v-else |
vue/no-non-component-keep-alive-child |
Incorreto · Correto | Proibir invólucros de elementos comuns diretamente abaixo de <KeepAlive> |
vue/no-preprocessor-lang |
Incorreto · Correto | Desencorajar o uso de preprocessadores CSS em favor de CSS moderno |
vue/no-reserved-component-names |
Incorreto · Correto | Proibir o uso de nomes reservados como nomes de componentes |
vue/no-root-v-if |
Incorreto · Correto | Proibir v-if no único elemento raiz de um template |
vue/no-script-non-standard-lang |
Incorreto · Correto | Desencorajar valores não padronizados de lang em scripts |
vue/no-src-attribute |
Incorreto · Correto | Desencorajar o atributo src em blocos de SFCs |
vue/no-static-inline-styles |
Incorreto · Correto | Proibir atributos estáticos de estilo inline |
vue/no-template-key |
Incorreto · Correto | Proibir o atributo key em <template> |
vue/no-template-lang |
Incorreto · Correto | Desencorajar o atributo lang no bloco template |
vue/no-template-shadow |
Incorreto · Correto | Proibir nomes de variáveis que ocultam variáveis de um escopo externo |
vue/no-template-target-blank |
Incorreto · Correto | Proibir target="_blank" sem rel="noopener noreferrer" |
vue/no-textarea-mustache |
Incorreto · Correto | Proibir interpolação com chaves duplas em <textarea> |
vue/no-undefined-refs |
Incorreto · Correto | Proibir referências a variáveis não definidas nos templates |
vue/no-unsafe-url |
Incorreto · Correto | Alertar sobre vinculações de URL potencialmente inseguras |
vue/no-unsandboxed-iframe |
Incorreto · Correto | Exigir um atributo sandbox nos elementos iframe |
vue/no-unused-components |
Incorreto · Correto | Proibir o registro de componentes não usados nos templates |
vue/no-unused-properties |
Incorreto · Correto | Proibir propriedades não usadas definidas em defineProps |
vue/no-unused-refs |
Incorreto · Correto | Reportar refs de template (ref="x") nunca referenciadas em <script> |
vue/no-unused-setup-bindings |
Incorreto · Correto | Proibir variáveis de script setup que nunca são lidas |
vue/no-unused-vars |
Incorreto · Correto | Proibir definições de variáveis não usadas nas diretivas v-for e v-slot |
vue/no-use-v-else-with-v-for |
Incorreto · Correto | Proibir v-else-if ou v-else no mesmo elemento que v-for |
vue/no-use-v-if-with-v-for |
Incorreto · Correto | Proibir v-if no mesmo elemento que v-for |
vue/no-useless-mustaches |
Incorreto · Correto | Proibir interpolação com chaves duplas cuja expressão seja uma string literal constante |
vue/no-useless-template-attributes |
Incorreto · Correto | Proibir atributos sem efeito em elementos <template> |
vue/no-useless-v-bind |
Incorreto · Correto | Proibir um v-bind cujo valor seja uma string literal simples |
vue/no-v-for-template-key-on-child |
Incorreto · Correto | Proibir key no filho de um <template v-for> |
vue/no-v-html |
Incorreto · Correto | Alertar sobre v-html para prevenir vulnerabilidades XSS |
vue/no-v-text |
Incorreto · Correto | Proibir a diretiva v-text; preferir interpolação com chaves duplas |
vue/no-v-text-v-html-on-component |
Incorreto · Correto | Proibir v-text / v-html em elementos de componente |
vue/permitted-contents |
Incorreto · Correto | Aplicar as regras do modelo de conteúdo HTML |
vue/prefer-props-shorthand |
Incorreto · Correto | Recomendar sintaxe abreviada para props (Vue 3.4+) |
vue/prefer-true-attribute-shorthand |
Incorreto · Correto | Preferir a forma abreviada para um atributo booleano vinculado a true |
vue/prop-name-casing |
Incorreto · Correto | Aplicar um padrão de maiúsculas e minúsculas aos nomes de props declaradas |
vue/require-component-is |
Incorreto · Correto | Exigir v-bind:is em elementos <component> |
vue/require-component-registration |
Incorreto · Correto | Exigir importação ou registro explícito de componentes |
vue/require-scoped-style |
Incorreto · Correto | Exigir o atributo scoped nas tags style |
vue/require-toggle-inside-transition |
Incorreto · Correto | Exigir uma alternância no elemento envolvido por <transition> |
vue/require-v-for-key |
Incorreto · Correto | Exigir v-bind:key nas diretivas v-for |
vue/scoped-event-names |
Incorreto · Correto | Recomendar nomes de eventos com escopo no formato context:event |
vue/sfc-element-order |
Incorreto · Correto | Aplicar uma ordem consistente aos elementos de nível superior dos SFCs |
vue/single-style-block |
Incorreto · Correto | Recomendar um único bloco style |
vue/slot-name-casing |
Incorreto · Correto | Exigir kebab-case nos slots nomeados usados por v-slot |
vue/this-in-template |
Incorreto · Correto | Proibir this. nas expressões do template |
vue/use-unique-element-ids |
Incorreto · Correto | Exigir IDs de elementos únicos por meio de useId(), em vez de literais estáticos |
vue/use-v-on-exact |
Incorreto · Correto | Exigir o modificador .exact em v-on quando houver manipuladores baseados em modificadores |
vue/v-bind-style |
Incorreto · Correto | Aplicar um padrão de sintaxe à diretiva v-bind |
vue/v-on-event-hyphenation |
Incorreto · Correto | Exigir hífens nos nomes de eventos personalizados em v-on de componentes |
vue/v-on-handler-style |
Incorreto · Correto | Exigir manipuladores de v-on escritos como referência a método ou função inline |
vue/v-on-style |
Incorreto · Correto | Aplicar um padrão de sintaxe à diretiva v-on |
vue/v-slot-style |
Incorreto · Correto | Aplicar um padrão de sintaxe à diretiva v-slot |
vue/valid-attribute-name |
Incorreto · Correto | Exigir nomes de atributos válidos |
vue/valid-template-root |
Incorreto · Correto | Exigir uma raiz <template> válida para a semântica de fragmentos do Vue 3 |
vue/valid-v-bind |
Incorreto · Correto | Exigir diretivas v-bind válidas |
vue/valid-v-cloak |
Incorreto · Correto | Exigir diretivas v-cloak válidas |
vue/valid-v-else |
Incorreto · Correto | Exigir diretivas v-else válidas |
vue/valid-v-else-if |
Incorreto · Correto | Exigir diretivas v-else-if válidas |
vue/valid-v-for |
Incorreto · Correto | Exigir diretivas v-for válidas |
vue/valid-v-html |
Incorreto · Correto | Exigir diretivas v-html válidas |
vue/valid-v-if |
Incorreto · Correto | Exigir diretivas v-if válidas |
vue/valid-v-is |
Incorreto · Correto | Exigir diretivas v-is válidas |
vue/valid-v-memo |
Incorreto · Correto | Exigir diretivas v-memo válidas |
vue/valid-v-model |
Incorreto · Correto | Exigir diretivas v-model válidas |
vue/valid-v-on |
Incorreto · Correto | Exigir diretivas v-on válidas |
vue/valid-v-once |
Incorreto · Correto | Exigir diretivas v-once válidas |
vue/valid-v-pre |
Incorreto · Correto | Exigir diretivas v-pre válidas |
vue/valid-v-show |
Incorreto · Correto | Exigir diretivas v-show válidas |
vue/valid-v-slot |
Incorreto · Correto | Exigir diretivas v-slot válidas |
vue/valid-v-text |
Incorreto · Correto | Exigir diretivas v-text válidas |
vue/warn-custom-block |
Incorreto · Correto | Alertar sobre blocos personalizados em arquivos SFC |
vue/warn-custom-directive |
Incorreto · Correto | Alertar sobre diretivas personalizadas que precisam de registro |
Todas as regras · Opções das regras · Mapa de migração do ESLint · Verificações do projeto · Atributos entre componentes
vue/a11y-img-alt
Exigir o atributo alt nas imagens para garantir acessibilidade
Severidade padrão: warning
Predefinições: none
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/a11y-img-alt": "warn"
}
},
},
});
vp run lint
Incorreto
Nem a imagem estática nem a imagem de origem dinâmica fornecem um atributo alt.
<template>
<img src="/photo.jpg" />
<img :src="photo" />
</template>
Correto
Imagens informativas recebem um texto alt descritivo; imagens decorativas recebem um alt vazio; a imagem dinâmica vincula sua descrição.
<template>
<!-- Informative image -->
<img src="/photo.jpg" alt="Team photo from company retreat" />
<!-- Decorative image (empty alt) -->
<img src="/decoration.svg" alt="" />
<!-- Dynamic alt -->
<img :src="photo" :alt="photoDescription" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/attribute-hyphenation
Aplicar um padrão de nomes de atributos em componentes personalizados
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Disponível para os diagnósticos compatíveis
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Consulte as opções tipadas e os valores padrão.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/attribute-hyphenation": "warn"
}
},
},
});
vp run lint
Incorreto
O atributo do componente usa a grafia camelCase firstName.
<template>
<UserCard firstName="Ada" />
</template>
Correto
A grafia first-name segue a convenção configurada de atributos de componente separados por hífen.
<template>
<UserCard first-name="Ada" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/attribute-order
Aplicar uma ordem consistente aos atributos
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/attribute-order": "warn"
}
},
},
});
vp run lint
Incorreto
O manipulador de evento aparece antes da diretiva estrutural v-if e do atributo comum id.
<template>
<div @click="onClick" v-if="show" id="main"></div>
</template>
Correto
v-if vem primeiro, seguido de id e do manipulador de evento, conforme a ordem da regra.
<template>
<div v-if="show" id="main" @click="onClick"></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/component-definition-name-casing
Exigir PascalCase ou kebab-case nos nomes de definição de componentes
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
O nome de arquivo do componente é verificado. PascalCase e kebab-case são aceitos; o uso misturado de maiúsculas e minúsculas é reportado.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/component-definition-name-casing": "warn"
}
},
},
});
vp run lint
Incorreto
O nome de arquivo myComponent.vue mistura uma inicial minúscula com uma letra maiúscula interna, em vez de usar PascalCase ou kebab-case.
myComponent.vue
<template><p>Content</p></template>
Correto
Renomear o arquivo para MyComponent.vue aplica PascalCase; o conteúdo do template permanece igual.
MyComponent.vue
<template><p>Content</p></template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/component-name-in-template-casing
Aplicar um padrão específico de maiúsculas e minúsculas aos nomes de componentes nos templates
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Disponível para os diagnósticos compatíveis
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Consulte as opções tipadas e os valores padrão.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/component-name-in-template-casing": "warn"
}
},
},
});
vp run lint
Incorreto
O componente é escrito em kebab-case e camelCase, embora a convenção seja PascalCase.
<script setup>
import MyComponent from "./MyComponent.vue";
</script>
<template>
<my-component />
<myComponent />
</template>
Correto
MyComponent usa PascalCase; a sintaxe nativa de slot permanece em minúsculas.
<script setup>
import MyComponent from "./MyComponent.vue";
</script>
<template>
<MyComponent />
<RouterView />
<slot />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/html-button-has-type
Exigir um type explícito e válido nos elementos button
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/html-button-has-type": "warn"
}
},
},
});
vp run lint
Incorreto
Um botão omite type e outro fornece o tipo foo, que não é aceito.
<template>
<button>Click</button>
<button type="foo">Click</button>
</template>
Correto
Os botões especificam button, submit ou reset; um type vinculado é tratado como dinâmico.
<template>
<button type="button">Click</button>
<button type="submit">Save</button>
<button type="reset">Reset</button>
<button :type="dynamicType">Click</button>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/html-quotes
Aplicar um padrão de aspas aos atributos HTML
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Disponível para os diagnósticos compatíveis
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Consulte as opções tipadas e os valores padrão.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/html-quotes": "warn"
}
},
},
});
vp run lint
Incorreto
Os atributos usam aspas simples ou nenhuma aspa, em vez da convenção de aspas duplas.
<template>
<div class='foo'></div>
<div class=foo></div>
<div v-if='ready'></div>
</template>
Correto
Tanto os atributos comuns quanto as expressões de diretivas usam aspas duplas.
<template>
<div class="foo"></div>
<div v-if="ready"></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/html-self-closing
Aplicar um padrão de tags com fechamento automático
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Disponível para os diagnósticos compatíveis
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Consulte as opções tipadas e os valores padrão.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/html-self-closing": "warn"
}
},
},
});
vp run lint
Incorreto
O componente vazio usa uma tag de fechamento separada, enquanto os elementos vazios img e br omitem a grafia de fechamento automático configurada.
<template>
<MyComponent></MyComponent>
<img>
<br>
</template>
Correto
O componente e os elementos vazios usam a sintaxe de fechamento automático; uma div com conteúdo mantém sua tag de fechamento.
<template>
<MyComponent />
<div></div>
<div />
<img />
<br />
<div>content</div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/max-template-complexity
Limitar a complexidade do próprio template de um componente, tanto ciclomática quanto cognitiva
Severidade padrão: warning
Predefinições: none
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Bad tem complexidade ciclomática 13 e complexidade cognitiva 25 (limites: 11 e 16). Cada componente é medido separadamente; apenas templates HTML inline são suportados.
Veja o cálculo da complexidade e os limites dos componentes para conhecer as contribuições às duas pontuações do exemplo.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/max-template-complexity": "warn"
}
},
},
});
vp run lint
Incorreto
As ramificações, o laço, o conteúdo de slot e as decisões em expressões escritos pelo componente pai produzem pontuações de 13 e 25, acima dos limites padrão de 11 e 16.
<script setup lang="ts">
defineProps<{ rows: Row[] }>();
</script>
<template>
<section>
<h1>{{ user ? user.name : 'Guest' }}</h1>
<DataTable :rows="rows">
<template #cell="{ row, column }">
<span v-if="column.key === 'status'" :class="row.active ? 'on' : 'off'">{{ row.status ?? 'unknown' }}</span>
<a v-else-if="column.key === 'link' && row.url" :href="row.url">{{ row.label }}</a>
<template v-else>
<em v-for="tag in row.tags" :key="tag">
<b v-if="tag.pinned || tag.starred">{{ tag.hot ? '!' : '' }}</b>
</em>
</template>
</template>
</DataTable>
<p v-if="!rows.length && !loading">No data</p>
</section>
</template>
Correto
O template pai delega a renderização a RowList e mantém um v-if; suas próprias pontuações são 2 e 1.
<template>
<RowList v-if="ready" :rows="rows" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/multi-word-component-names
Exigir nomes de componentes com mais de uma palavra
Severidade padrão: error
Predefinições: essential, nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
A ocorrência diagnosticada é o nome de arquivo. Renomeie o mesmo componente; alterar uma tag filha não corrige o problema.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/multi-word-component-names": "error"
}
},
},
});
vp run lint
Incorreto
Item.vue dá ao componente um nome de uma única palavra.
Item.vue
<template><p>Item</p></template>
Correto
TodoItem.vue dá ao mesmo template um nome de componente com mais de uma palavra.
TodoItem.vue
<template><p>Item</p></template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/mustache-interpolation-spacing
Aplicar espaçamento consistente dentro das interpolações com chaves duplas
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Disponível para os diagnósticos compatíveis
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Consulte as opções tipadas e os valores padrão.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/mustache-interpolation-spacing": "warn"
}
},
},
});
vp run lint
Incorreto
A interpolação de texto não tem um espaço junto a um ou a ambos os delimitadores.
<template>
<div>{{text}}</div>
<div>{{ text}}</div>
<div>{{text }}</div>
</template>
Correto
Espaços separam a expressão dos delimitadores de abertura e fechamento das chaves duplas.
<template>
<div>{{ text }}</div>
<div>{{ foo.bar }}</div>
<div>{{ foo + bar }}</div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-array-index-key
Proibir o uso direto da variável de índice de v-for como :key
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-array-index-key": "warn"
}
},
},
});
vp run lint
Incorreto
A chave da lista é seu índice atual, então a identidade do item muda quando a lista é reordenada.
<template>
<li v-for="(item, index) in items" :key="index">{{ item.name }}</li>
</template>
Correto
A chave vem de item.id, preservando a identidade de cada item quando sua posição muda.
<template>
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-bare-strings-in-template
Proibir texto legível por pessoas diretamente no template quando ele deve ser internacionalizado
Severidade padrão: warning
Predefinições: none
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-bare-strings-in-template": "warn"
}
},
},
});
vp run lint
Incorreto
O texto visível e os atributos de identificação incorporam strings sem tradução diretamente no template.
<template>
<div>hello</div>
<img alt="a cat" />
<input placeholder="Search" />
<button title="Close">x</button>
</template>
Correto
O conteúdo traduzível chama $t; os exemplos com pontuação e apenas números são exceções permitidas.
<template>
<div>{{ $t('hello') }}</div>
<img :alt="$t('cat')" />
<div>-</div>
<div>123</div>
<button :title="$t('close')">{{ $t('x') }}</button>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-boolean-attr-value
Proibir valores explícitos em atributos HTML booleanos
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Disponível para os diagnósticos compatíveis
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-boolean-attr-value": "warn"
}
},
},
});
vp run lint
Incorreto
Os atributos booleanos disabled e checked contêm valores de string redundantes.
<template>
<input disabled="disabled" />
<input checked="checked" />
<button disabled="true">Save</button>
</template>
Correto
A presença de cada atributo booleano expressa o mesmo estado ativado, sem um valor.
<template>
<input disabled />
<input checked />
<button disabled>Save</button>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-child-content
Proibir conteúdo filho ao usar v-html ou v-text
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-child-content": "error"
}
},
},
});
vp run lint
Incorreto
v-text substitui o conteúdo do parágrafo, então o texto alternativo escrito no template não pode ser preservado por essa diretiva.
<template>
<p v-text="message">Fallback text</p>
</template>
Correto
Remover o texto filho deixa v-text como a única fonte de conteúdo do parágrafo.
<template>
<p v-text="message" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-deprecated-filter
Proibir a sintaxe obsoleta de filtros do Vue 2 com o operador de barra vertical
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-deprecated-filter": "error"
}
},
},
});
vp run lint
Incorreto
A barra vertical usa a sintaxe de filtros removida do Vue para aplicar capitalize.
<template>
{{ message | capitalize }}
</template>
Correto
Chamar capitalize(message) aplica a transformação como uma expressão comum.
<template>
{{ capitalize(message) }}
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-deprecated-functional-template
Proibir o atributo functional no <template> de um SFC
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-deprecated-functional-template": "error"
}
},
},
});
vp run lint
Incorreto
O template do SFC tem o atributo functional removido e lê o antigo contexto props.
<template functional>
<div>{{ props.msg }}</div>
</template>
Correto
O template comum omite functional e lê diretamente a variável msg exposta pelo componente.
<template>
<div>{{ msg }}</div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-deprecated-html-element-is
Proibir o atributo is em elementos HTML nativos
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-deprecated-html-element-is": "error"
}
},
},
});
vp run lint
Incorreto
Uma div nativa usa o antigo atributo is sem prefixo para solicitar um componente Vue.
<template>
<div is="MyComponent" />
</template>
Correto
Um componente dinâmico usa :is; a forma no elemento nativo usa explicitamente o prefixo vue:.
<template>
<component :is="MyComponent" />
<div is="vue:MyComponent" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-deprecated-inline-template
Proibir o atributo obsoleto inline-template
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-deprecated-inline-template": "error"
}
},
},
});
vp run lint
Incorreto
Card usa o atributo obsoleto inline-template para o conteúdo fornecido.
<template>
<Card inline-template><p>Details</p></Card>
</template>
Correto
O mesmo conteúdo é passado normalmente, sem o atributo inline-template.
<template>
<Card><p>Details</p></Card>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-deprecated-router-link-tag-prop
Proibir a prop tag em <router-link>
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-deprecated-router-link-tag-prop": "error"
}
},
},
});
vp run lint
Incorreto
RouterLink usa a prop tag removida para solicitar um elemento button.
<template>
<router-link to="/home" tag="button">Home</router-link>
</template>
Correto
O slot fornece navigate a um botão escrito explicitamente no template.
<template>
<router-link to="/home" v-slot="{ navigate }">
<button @click="navigate">Home</button>
</router-link>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-deprecated-scope-attribute
Proibir o atributo obsoleto scope em <template>
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-deprecated-scope-attribute": "error"
}
},
},
});
vp run lint
Incorreto
O template do slot declara props pelo atributo obsoleto scope.
<template>
<Card><template scope="props">{{ props.name }}</template></Card>
</template>
Correto
A diretiva do slot padrão declara a mesma variável props pela sintaxe atual de slots.
<template>
<Card><template #default="props">{{ props.name }}</template></Card>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-deprecated-slot-attribute
Proibir o atributo obsoleto slot
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-deprecated-slot-attribute": "error"
}
},
},
});
vp run lint
Incorreto
O slot header é selecionado pelo antigo atributo slot.
<template>
<Foo>
<template slot="header"><h1>Title</h1></template>
<div :slot="name">Title</div>
</Foo>
</template>
Correto
v-slot:header seleciona explicitamente o slot header com a diretiva atual.
<template>
<Foo>
<template v-slot:header><h1>Title</h1></template>
</Foo>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-deprecated-slot-scope-attribute
Proibir o atributo obsoleto slot-scope
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-deprecated-slot-scope-attribute": "error"
}
},
},
});
vp run lint
Incorreto
O template recebe as props do slot pelo atributo obsoleto slot-scope.
<template>
<Card><template slot-scope="props">{{ props.name }}</template></Card>
</template>
Correto
A diretiva #default recebe essas props sem slot-scope.
<template>
<Card><template #default="props">{{ props.name }}</template></Card>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-deprecated-v-bind-sync
Proibir o modificador obsoleto .sync em v-bind
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-deprecated-v-bind-sync": "error"
}
},
},
});
vp run lint
Incorreto
As vinculações usam o modificador .sync removido, inclusive em combinação com .camel.
<template>
<MyComponent :title.sync="title" />
<MyComponent v-bind:title.sync="title" />
<MyComponent :title.sync.camel="title" />
</template>
Correto
Use uma vinculação comum unidirecional de title ou v-model:title quando for necessário um canal de atualização.
<template>
<MyComponent :title="title" />
<MyComponent v-model:title="title" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-deprecated-v-is
Proibir a diretiva obsoleta v-is
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-deprecated-v-is": "error"
}
},
},
});
vp run lint
Incorreto
v-is foi descontinuada no Vue 3.1; o exemplo ainda a usa para trocar o componente renderizado.
<template>
<tr v-is="'MyRow'"></tr>
</template>
Correto
O atributo is com o prefixo vue:, ou <component :is>, seleciona o componente em seu lugar.
<template>
<tr is="vue:MyRow"></tr>
<component :is="MyRow" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-deprecated-v-on-native-modifier
Proibir o modificador obsoleto .native em v-on
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-deprecated-v-on-native-modifier": "error"
}
},
},
});
vp run lint
Incorreto
Os manipuladores do componente usam o modificador de evento .native removido.
<template>
<MyComponent @click.native="handler" />
<MyComponent v-on:click.native="handler" />
<MyComponent @click.native.stop="handler" />
</template>
Correto
Os manipuladores omitem .native e preservam outros modificadores de evento, como .stop.
<template>
<MyComponent @click="handler" />
<MyComponent @click.stop="handler" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-deprecated-v-on-number-modifiers
Proibir modificadores numéricos obsoletos de keyCode em v-on
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Disponível para os diagnósticos compatíveis
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Seleção de modificadores numéricos e correções
O primeiro modificador numérico cujo nome começa com um inteiro decimal determina o diagnóstico. @keyup.13.27="submit" reporta apenas 13 e oferece @keyup.enter.27="submit"; outra passagem de correção pode substituir 27 por escape. @keyup.13suffix="submit" também se torna @keyup.enter="submit". Os valores de 0 a 9 são isentos, portanto @keyup.0.13="submit" não gera diagnóstico desta regra. Valores desconhecidos, como 999, são reportados sem correção. A isenção existente para Vue 2 e petite-vue continua em vigor.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-deprecated-v-on-number-modifiers": "error"
}
},
},
});
vp run lint
Incorreto
Os manipuladores de teclado identificam as teclas pelos códigos numéricos removidos 13 e 27.
<template>
<input @keyup.13="submit" />
<input v-on:keyup.27="cancel" />
<input @keyup.13.stop="submit" />
</template>
Correto
Os manipuladores usam os modificadores de tecla nomeados enter e esc.
<template>
<input @keyup.enter="submit" />
<input @keyup.esc="cancel" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-dupe-v-else-if
Proibir condições duplicadas em cadeias de v-if / v-else-if
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-dupe-v-else-if": "error"
}
},
},
});
vp run lint
Incorreto
O else-if repete a condição ready já testada pelo primeiro ramo, tornando esse ramo posterior inacessível.
<template>
<p v-if="status === 'ready'">Ready</p>
<p v-else-if="status === 'ready'">Still ready</p>
</template>
Correto
O segundo ramo testa loading, um estado distinto que pode alcançar o else-if.
<template>
<p v-if="status === 'ready'">Ready</p>
<p v-else-if="status === 'loading'">Loading</p>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-duplicate-attributes
Proibir atributos duplicados no mesmo elemento
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-duplicate-attributes": "error"
}
},
},
});
vp run lint
Incorreto
O mesmo botão declara class duas vezes, em vez de usar um único valor combinado de class.
<template>
<button class="primary" class="large">Save</button>
</template>
Correto
Os dois nomes de classe aparecem em um único atributo class.
<template>
<button class="primary large">Save</button>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-empty-component-block
Proibir blocos vazios em SFCs
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-empty-component-block": "warn"
}
},
},
});
vp run lint
Incorreto
Os blocos template, script e style não contêm conteúdo significativo.
<template></template>
<script></script>
<style>
</style>
Correto
Cada bloco mantido contém marcação, declarações de script ou declarações de estilo de fato.
<template>
<div>Hello</div>
</template>
<script setup>
const message = "Hello";
</script>
<style scoped>
.button { color: red; }
</style>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-inline-style
Desencorajar o uso de atributos de estilo inline
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-inline-style": "warn"
}
},
},
});
vp run lint
Incorreto
O atributo style estático incorpora a declaração de cor no elemento.
<template>
<div style="color: red">Text</div>
</template>
Correto
Classes expressam a cor fixa; a largura dependente de ratio permanece como uma vinculação dinâmica de estilo, fora da verificação de atributos estáticos.
<template>
<div class="text-red">Text</div>
<span :class="{ 'text-red': isRed }">Text</span>
<div :style="{ width: `${ratio}%` }">Text</div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-invalid-html-attribute
Proibir valores estáticos inválidos para atributos HTML
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-invalid-html-attribute": "warn"
}
},
},
});
vp run lint
Incorreto
A âncora usa stylesheet como valor de rel, embora esse valor pertença a elementos link de folhas de estilo.
<template>
<a href="/guide" rel="stylesheet">Guide</a>
</template>
Correto
A âncora usa help, um valor de rel apropriado para um recurso de ajuda vinculado.
<template>
<a href="/guide" rel="help">Guide</a>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-lone-template
Proibir elementos <template> desnecessários
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-lone-template": "warn"
}
},
},
});
vp run lint
Incorreto
O template interno não tem uma diretiva nem uma função de slot que lhe dê uma finalidade estrutural.
<template>
<div><template><p>Details</p></template></div>
</template>
Correto
Remover o invólucro desnecessário deixa o parágrafo diretamente dentro da div.
<template>
<div><p>Details</p></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-multi-spaces
Proibir vários espaços consecutivos
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Disponível para os diagnósticos compatíveis
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-multi-spaces": "warn"
}
},
},
});
vp run lint
Incorreto
Dois espaços separam os atributos ou o nome do elemento e o primeiro atributo.
<template>
<div class="panel"></div>
<div class="panel" id="main"></div>
</template>
Correto
Espaços únicos separam os mesmos atributos.
<template>
<div class="panel"></div>
<div class="panel" id="main"></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-multiple-objects-in-class
Proibir vários objetos literais dentro de uma vinculação de array em :class
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-multiple-objects-in-class": "warn"
}
},
},
});
vp run lint
Incorreto
Um array de classes contém dois objetos literais no nível superior que podem ser combinados.
<template>
<div :class="[{ a }, { b }]"></div>
<div :class="[{ active: isActive }, { error: hasError }]"></div>
</template>
Correto
Um único objeto contém as condições das classes; arrays com um objeto e uma string ou com entradas não literais continuam permitidos.
<template>
<div :class="{ a, b }"></div>
<div :class="[{ active: isActive }, 'static']"></div>
<div :class="[foo, bar]"></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-multiple-template-root
Proibir vários nós raiz em um template
Severidade padrão: error
Predefinições: none
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Ative apenas quando houver um contrato de raiz única. O Vue 3 normalmente suporta fragmentos.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-multiple-template-root": "error"
}
},
},
});
vp run lint
Incorreto
A convenção opcional de raiz única encontra dois parágrafos irmãos na raiz do template.
<template>
<p>First</p>
<p>Second</p>
</template>
Correto
Uma section envolve os parágrafos em uma única raiz; ative essa convenção apenas quando houver um contrato de raiz única.
<template>
<section><p>First</p><p>Second</p></section>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-mutating-props
Proibir a mutação de props de componentes
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Consulte as opções tipadas e os valores padrão.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-mutating-props": "error"
}
},
},
});
vp run lint
Incorreto
Incrementar props.count escreve diretamente em um valor fornecido pelo componente pai.
<script setup lang="ts">
const props = defineProps<{ count: number }>();
props.count++;
</script>
Correto
O componente emite update:count com o próximo valor, deixando o pai responsável por atualizar a prop.
<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>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-negated-v-if-condition
Proibir uma condição negada em v-if quando a cadeia tiver v-else
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-negated-v-if-condition": "warn"
}
},
},
});
vp run lint
Incorreto
Os ramos emparelhados v-if e v-else começam com uma condição negada.
<template>
<div v-if="!ok">A</div>
<div v-else>B</div>
</template>
Correto
Uma condição positiva ok vem primeiro; ao inverter uma condição, coloque primeiro o ramo originalmente oposto. Um v-if negado isolado e comparações !== continuam permitidos.
<template>
<div v-if="ok">B</div>
<div v-else>A</div>
<div v-if="!ok">A</div>
<div v-if="a !== b">A</div>
<div v-else>B</div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-non-component-keep-alive-child
Proibir invólucros de elementos comuns diretamente abaixo de <KeepAlive>
Severidade padrão: warning
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-non-component-keep-alive-child": "warn"
}
},
},
});
vp run lint
Incorreto
KeepAlive envolve condicionalmente uma div nativa, em vez de armazenar UserCard diretamente em cache.
<template>
<KeepAlive>
<div v-if="ready">
<UserCard />
</div>
</KeepAlive>
</template>
Correto
O primeiro exemplo torna UserCard o filho condicional. O invólucro com v-show ilustra uma estrutura fora desta verificação de filhos condicionais, sem prometer que o invólucro nativo seja armazenado em cache.
<template>
<KeepAlive>
<UserCard v-if="ready" />
</KeepAlive>
<KeepAlive>
<div v-show="opened">
<UserCard />
</div>
</KeepAlive>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-preprocessor-lang
Desencorajar o uso de preprocessadores CSS em favor de CSS moderno
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-preprocessor-lang": "warn"
}
},
},
});
vp run lint
Incorreto
O bloco style seleciona SCSS com lang. Isso descreve a convenção pretendida de não usar preprocessadores; o processamento atual de SFCs não emite esta regra.
<template><p>Notice</p></template>
<style lang="scss">
.notice { color: red; }
</style>
Correto
As mesmas declarações CSS omitem o lang do preprocessador. Essa é a correção da convenção, e não uma diferença executável de diagnósticos entre Bad/Good hoje.
<template><p>Notice</p></template>
<style>
.notice { color: red; }
</style>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-reserved-component-names
Proibir o uso de nomes reservados como nomes de componentes
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-reserved-component-names": "error"
}
},
},
});
vp run lint
Incorreto
O nome de componente button entra em conflito com o nome de um elemento HTML nativo.
<script>
export default {
name: "button",
};
</script>
Correto
AppButton é um nome de componente da aplicação e não reutiliza o nome nativo button.
<script setup lang="ts">
defineOptions({ name: "AppButton" });
</script>
<template>
<Transition>
<AppButton />
</Transition>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-root-v-if
Proibir v-if no único elemento raiz de um template
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-root-v-if": "warn"
}
},
},
});
vp run lint
Incorreto
A própria raiz do componente aparece e desaparece sob v-if.
<template>
<div v-if="show">content</div>
</template>
Correto
Uma div externa estável permanece como raiz, enquanto o parágrafo aninhado recebe a condição de visibilidade.
<template>
<div>
<p v-if="show">content</p>
</div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-script-non-standard-lang
Desencorajar valores não padronizados de lang em scripts
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Não implementada no lint de SFC
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Suporte atual: no-sfc-finding
Esta entrada do catálogo atualmente não emite uma ocorrência específica da regra pelo lint de SFCs. O par Bad/Good descreve a convenção pretendida, e não uma ocorrência executável. Ativar o ID não fornece a verificação de SFC ausente.
ID configurado (sem diagnóstico de SFC atualmente)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-script-non-standard-lang": "warn"
}
},
},
});
vp run lint
Incorreto
O script usa sintaxe CoffeeScript com lang=coffee. O processamento atual de SFCs não emite esta regra do catálogo para essa linguagem.
<script lang="coffee">
count = 0
</script>
<template><p>Notice</p></template>
Correto
O script usa uma declaração TypeScript comum com lang=ts, ilustrando a convenção de linguagem pretendida.
<script lang="ts">
const count = 0;
</script>
<template><p>Notice</p></template>
O exemplo correto ilustra a convenção pretendida; o fluxo atual de SFC não emite o diagnóstico específico da regra para nenhum dos exemplos.
Implementação · Todas as regras
vue/no-src-attribute
Desencorajar o atributo src em blocos de SFCs
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-src-attribute": "warn"
}
},
},
});
vp run lint
Incorreto
Os blocos do SFC delegam o conteúdo de template, script e style a arquivos src.
<template src="./template.html"></template>
<script src="./script.ts"></script>
<style src="./style.css"></style>
Correto
Cada bloco do SFC contém seu próprio conteúdo, sem um atributo src externo.
<template>
<p>Hello</p>
</template>
<script setup lang="ts">
const label = "Hello";
</script>
<style scoped>
p {
color: red;
}
</style>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-static-inline-styles
Proibir atributos estáticos de estilo inline
Severidade padrão: warning
Predefinições: none
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-static-inline-styles": "warn"
}
},
},
});
vp run lint
Incorreto
O parágrafo contém a declaração de cor constante no atributo style.
<template>
<p style="color: red">Notice</p>
</template>
Correto
Uma classe notice e uma folha de estilo com escopo mantêm a cor constante fora do atributo no template.
<template><p class="notice">Notice</p></template>
<style scoped>.notice { color: red; }</style>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-template-key
Proibir o atributo key em <template>
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-template-key": "error"
}
},
},
});
vp run lint
Incorreto
Um invólucro template sem laço tem uma key, embora não seja o limite da iteração com chave.
<template>
<template :key="section"><div>Details</div></template>
</template>
Correto
A key pertence a uma iteração template v-for, na qual identifica cada fragmento repetido.
<template>
<template v-for="item in items" :key="item.id"><div>{{ item.name }}</div></template>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-template-lang
Desencorajar o atributo lang no bloco template
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-template-lang": "warn"
}
},
},
});
vp run lint
Incorreto
O template seleciona Pug por meio de lang. Essa é uma convenção pretendida de usar apenas HTML; o processamento atual de SFCs não gera diagnósticos para este ID do catálogo.
<template lang="pug">
p Notice
</template>
Correto
Um template HTML comum omite lang e usa o parágrafo diretamente. Isso ilustra a convenção sem afirmar que há uma ocorrência diagnosticada atualmente em SFCs.
<template>
<p>Notice</p>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-template-shadow
Proibir nomes de variáveis que ocultam variáveis de um escopo externo
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
A verificação compara as vinculações de v-for, v-slot (incluindo #name) e slots com escopo da sintaxe legada dentro do template. Ela reporta o identificador que oculta uma vinculação anterior, incluindo declarações no mesmo elemento, na ordem dos atributos. Elementos irmãos têm escopos independentes. Chaves de propriedades e referências em valores padrão não são declarações, e v-pre torna sua subárvore inerte.
Nomes do script e de propriedades do componente estão fora da verificação atual: uma única vinculação no template não produz um aviso apenas porque uma vinculação no script tem o mesmo nome. Os intervalos de diagnóstico abrangem o identificador como foi escrito no código-fonte, incluindo grafias com escapes e entidades HTML.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-template-shadow": "warn"
}
},
},
});
vp run lint
Incorreto
O v-for interno declara item novamente e oculta a variável item externa dentro do laço aninhado.
<template>
<div v-for="item in items" :key="item.id"><span v-for="item in item.children" :key="item.id">{{ item.name }}</span></div>
</template>
Correto
O laço interno declara child, deixando item disponível para a linha externa e child para a linha aninhada.
<template>
<div v-for="item in items" :key="item.id"><span v-for="child in item.children" :key="child.id">{{ child.name }}</span></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-template-target-blank
Proibir target="_blank" sem rel="noopener noreferrer"
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-template-target-blank": "warn"
}
},
},
});
vp run lint
Incorreto
O link externo abre um novo contexto de navegação sem a proteção rel esperada.
<template>
<a href="https://example.com" target="_blank">x</a>
</template>
Correto
O mesmo link inclui noopener noreferrer junto de target=_blank.
<template>
<a href="https://example.com" target="_blank" rel="noopener noreferrer">x</a>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-textarea-mustache
Proibir interpolação com chaves duplas em <textarea>
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-textarea-mustache": "error"
}
},
},
});
vp run lint
Incorreto
O textarea coloca message em uma interpolação filha, em vez de vincular seu valor.
<template>
<textarea>{{ message }}</textarea>
</template>
Correto
v-model vincula o valor editável do textarea a message.
<template>
<textarea v-model="message"></textarea>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-undefined-refs
Proibir referências a variáveis não definidas nos templates
Severidade padrão: warning
Predefinições: none
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-undefined-refs": "warn"
}
},
},
});
vp run lint
Incorreto
O template lê missing, embora o script declare apenas message.
<script setup>const message = "Hello";</script>
<template>{{ missing }}</template>
Correto
A interpolação lê a variável message existente.
<script setup>const message = "Hello";</script>
<template>{{ message }}</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-unsafe-url
Alertar sobre vinculações de URL potencialmente inseguras
Severidade padrão: warning
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-unsafe-url": "warn"
}
},
},
});
vp run lint
Incorreto
O destino da âncora começa com o esquema executável javascript:.
<template>
<a href="javascript:alert(1)">Continue</a>
</template>
Correto
A âncora usa o destino local comum de navegação /next.
<template>
<a href="/next">Continue</a>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-unsandboxed-iframe
Exigir um atributo sandbox nos elementos iframe
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-unsandboxed-iframe": "warn"
}
},
},
});
vp run lint
Incorreto
O frame incorporado não tem um atributo sandbox que limite suas capacidades.
<template>
<iframe src="/embed"></iframe>
</template>
Correto
sandbox aplica restrições; allow-scripts habilita explicitamente essa única capacidade quando necessário.
<template>
<iframe src="/embed" sandbox></iframe>
<iframe src="/embed" sandbox="allow-scripts"></iframe>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-unused-components
Proibir o registro de componentes não usados nos templates
Severidade padrão: warning
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-unused-components": "warn"
}
},
},
});
vp run lint
Incorreto
UserAvatar é importado como componente, mas o template nunca o renderiza.
<script setup lang="ts">
import UserAvatar from "./UserAvatar.vue";
</script>
<template>
<p>{{ user.name }}</p>
</template>
Correto
O template renderiza o UserAvatar importado e passa a variável user.
<script setup lang="ts">
import UserAvatar from "./UserAvatar.vue";
</script>
<template>
<UserAvatar :user="user" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-unused-properties
Proibir propriedades não usadas definidas em defineProps
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-unused-properties": "warn"
}
},
},
});
vp run lint
Incorreto
O componente declara description como prop, mas renderiza apenas title.
<script setup lang="ts">
defineProps<{ title: string; description: string }>();
</script>
<template>
<h1>{{ title }}</h1>
</template>
Correto
As duas props declaradas são referenciadas pelo template.
<script setup lang="ts">
defineProps<{ title: string; description: string }>();
</script>
<template>
<h1>{{ title }}</h1>
<p>{{ description }}</p>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-unused-refs
Reportar refs de template (ref="x") nunca referenciadas em <script>
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-unused-refs": "warn"
}
},
},
});
vp run lint
Incorreto
O template declara o nome de ref unused sem uma variável de referência correspondente no script.
<template><input ref="unused" /></template>
<script setup>
const x = 1
</script>
Correto
A ref de template inputEl tem uma variável ref de mesmo nome em script setup.
<template><input ref="inputEl" /></template>
<script setup>
import { ref } from 'vue'
const inputEl = ref(null)
</script>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-unused-setup-bindings
Proibir variáveis de script setup que nunca são lidas
Severidade padrão: warning
Predefinições: none
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-unused-setup-bindings": "warn"
}
},
},
});
vp run lint
Incorreto
A variável message de script setup nunca é lida pelo template.
<script setup>const message = "Hello";</script>
<template><p>Welcome</p></template>
Correto
O parágrafo interpola message, usando a variável declarada.
<script setup>const message = "Hello";</script>
<template><p>{{ message }}</p></template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-unused-vars
Proibir definições de variáveis não usadas nas diretivas v-for e v-slot
Severidade padrão: warning
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-unused-vars": "warn"
}
},
},
});
vp run lint
Incorreto
O laço declara um index não usado e o slot declara foo sem referenciá-lo.
<template>
<li v-for="(item, index) in items" :key="item.id">{{ item.name }}</li>
<template v-slot="{ foo }">
<span>Hello</span>
</template>
</template>
Correto
Os exemplos usam index ou o marcam como intencionalmente não usado por meio de _index, e o slot renderiza data. Chaves de índice são apenas um exemplo de uso aqui, e não uma recomendação para manter a identidade estável dos itens.
<template>
<li v-for="(item, index) in items" :key="index">{{ item.name }}</li>
<li v-for="(item, _index) in items" :key="item.id">{{ item.name }}</li>
<template v-slot="{ data }">
<span>{{ data }}</span>
</template>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-use-v-else-with-v-for
Proibir v-else-if ou v-else no mesmo elemento que v-for
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-use-v-else-with-v-for": "warn"
}
},
},
});
vp run lint
Incorreto
O ramo else e a iteração v-for estão associados ao mesmo parágrafo.
<template>
<p v-if="ready">Ready</p>
<p v-else v-for="item in items" :key="item.id">{{ item.name }}</p>
</template>
Correto
Um template separado contém v-else, e seu parágrafo filho contém v-for.
<template>
<p v-if="ready">Ready</p>
<template v-else><p v-for="item in items" :key="item.id">{{ item.name }}</p></template>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-use-v-if-with-v-for
Proibir v-if no mesmo elemento que v-for
Severidade padrão: warning
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-use-v-if-with-v-for": "warn"
}
},
},
});
vp run lint
Incorreto
O mesmo elemento de lista combina v-if e v-for e testa a visibilidade por meio da variável do laço.
<template>
<li v-for="item in items" v-if="item.visible" :key="item.id">
{{ item.name }}
</li>
</template>
Correto
Uma coleção computada filtra os itens visíveis antes que o template itere sobre eles.
<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>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-useless-mustaches
Proibir interpolação com chaves duplas cuja expressão seja uma string literal constante
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-useless-mustaches": "warn"
}
},
},
});
vp run lint
Incorreto
A interpolação contém apenas uma string constante e não precisa avaliar uma expressão.
<template>
<div>{{ 'x' }}</div>
<div>{{ "x" }}</div>
<div>{{ `x` }}</div>
</template>
Correto
O texto literal é escrito diretamente; expressões com variáveis, strings de template interpoladas e espaços separadores intencionais continuam sendo casos de interpolação.
<template>
<div>x</div>
<div>{{ x }}</div>
<div>{{ `pre-${x}` }}</div>
<span>A</span> {{ " " }} <span>B</span>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-useless-template-attributes
Proibir atributos sem efeito em elementos <template>
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-useless-template-attributes": "error"
}
},
},
});
vp run lint
Incorreto
O template condicional tem uma class, mas esse invólucro estrutural não renderiza um elemento DOM para recebê-la.
<template>
<section><template v-if="ready" class="notice"><p>Ready</p></template></section>
</template>
Correto
A class passa para o parágrafo que é realmente renderizado, enquanto v-if permanece no template estrutural.
<template>
<section><template v-if="ready"><p class="notice">Ready</p></template></section>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-useless-v-bind
Proibir um v-bind cujo valor seja uma string literal simples
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-useless-v-bind": "warn"
}
},
},
});
vp run lint
Incorreto
A vinculação foo avalia uma string constante entre aspas ou uma string de template sem interpolação.
<template>
<div :foo="'bar'"></div>
<div :foo="`bar`"></div>
</template>
Correto
O valor constante vira um atributo estático; valores com variáveis e interpolações mantêm sua vinculação.
<template>
<div foo="bar"></div>
<div :foo="bar"></div>
<div :foo="`pre-${bar}`"></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-v-for-template-key-on-child
Proibir key no filho de um <template v-for>
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-v-for-template-key-on-child": "error"
}
},
},
});
vp run lint
Incorreto
O parágrafo filho tem a key, enquanto a própria iteração template não tem chave.
<template>
<template v-for="item in items"><p :key="item.id">{{ item.name }}</p></template>
</template>
Correto
A key passa para template v-for, identificando o fragmento repetido completo.
<template>
<template v-for="item in items" :key="item.id"><p>{{ item.name }}</p></template>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-v-html
Alertar sobre v-html para prevenir vulnerabilidades XSS
Severidade padrão: warning
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-v-html": "warn"
}
},
},
});
vp run lint
Incorreto
v-html interpreta content como HTML, em vez de texto comum.
<template>
<article v-html="content" />
</template>
Correto
A interpolação com chaves duplas exibe content como texto escapado, em vez de injetar HTML.
<template>
<article>{{ content }}</article>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-v-text
Proibir a diretiva v-text; preferir interpolação com chaves duplas
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-v-text": "warn"
}
},
},
});
vp run lint
Incorreto
O conteúdo da div é fornecido pela diretiva v-text.
<template>
<div v-text="message"></div>
</template>
Correto
A interpolação com chaves duplas expressa a mesma vinculação de texto diretamente no conteúdo do elemento.
<template>
<div>{{ message }}</div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/no-v-text-v-html-on-component
Proibir v-text / v-html em elementos de componente
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-v-text-v-html-on-component": "error"
}
},
},
});
vp run lint
Incorreto
A tag do componente recebe v-html ou v-text, que substitui o conteúdo do elemento em vez de fornecer slots ao componente.
<template>
<MyComponent v-html="content" />
<MyComponent v-text="content" />
</template>
Correto
Elementos HTML nativos podem receber as diretivas; MyComponent recebe seu conteúdo pelo slot padrão.
<template>
<div v-html="content"></div>
<component is="div" v-html="content" />
<MyComponent>{{ content }}</MyComponent>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/permitted-contents
Aplicar as regras do modelo de conteúdo HTML
Severidade padrão: error
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/permitted-contents": "error"
}
},
},
});
vp run lint
Incorreto
Os exemplos colocam conteúdo em bloco dentro de p, omitem o corpo da tabela, aninham controles interativos ou colocam uma div diretamente dentro de ul.
<template>
<p><div>block in a paragraph</div></p>
<table><tr><td>row without tbody</td></tr></table>
<a href="#"><button type="button">nested control</button></a>
<ul><div>not a list item</div></ul>
</template>
Correto
Os exemplos usam conteúdo inline no parágrafo, um tbody explícito e filhos li. O componente personalizado MyItem não é tratado como um filho nativo conhecido de ul.
<template>
<p><span>inline in a paragraph</span></p>
<table><tbody><tr><td>cell</td></tr></tbody></table>
<ul><li>list item</li><MyItem /></ul>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/prefer-props-shorthand
Recomendar sintaxe abreviada para props (Vue 3.4+)
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Disponível para os diagnósticos compatíveis
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/prefer-props-shorthand": "warn"
}
},
},
});
vp run lint
Incorreto
Cada vinculação repete o nome da variável correspondente, inclusive o equivalente camelCase de um argumento separado por hífen.
<template>
<MyComponent :foo="foo" />
<MyComponent :user-name="userName" />
<span :style="style" />
<div :aria-label="ariaLabel" />
</template>
Correto
A forma abreviada de vinculação de mesmo nome do Vue 3.4+ remove as expressões repetidas; uma variável de origem diferente, como bar, permanece explícita.
<template>
<MyComponent :foo />
<MyComponent :user-name />
<span :style />
<div :aria-label />
<MyComponent :foo="bar" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/prefer-true-attribute-shorthand
Preferir a forma abreviada para um atributo booleano vinculado a true
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/prefer-true-attribute-shorthand": "warn"
}
},
},
});
vp run lint
Incorreto
Um atributo booleano nativo disabled vincula o valor constante true.
<template>
<input :disabled="true" />
</template>
Correto
O atributo nativo usa sua forma booleana abreviada. Vinculações false e props de componentes mantêm seus valores explícitos.
<template>
<input disabled />
<input :disabled="false" />
<MyComponent :visible="true" />
<MyComponent :visible="isVisible" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/prop-name-casing
Aplicar um padrão de maiúsculas e minúsculas aos nomes de props declaradas
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Verifica os nomes de props declaradas, e não o padrão de maiúsculas e minúsculas dos atributos passados a um filho.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/prop-name-casing": "warn"
}
},
},
});
vp run lint
Incorreto
O nome de prop declarado user_name usa uma grafia separada por sublinhado.
<script setup lang="ts">
defineProps<{ user_name: string }>();
</script>
<template><p>{{ user_name }}</p></template>
Correto
A declaração e sua referência no template usam o nome camelCase userName.
<script setup lang="ts">
defineProps<{ userName: string }>();
</script>
<template><p>{{ userName }}</p></template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/require-component-is
Exigir v-bind:is em elementos <component>
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/require-component-is": "error"
}
},
},
});
vp run lint
Incorreto
O <component> dinâmico não tem um destino is, então o Vue não pode escolher um componente para renderizar.
<template>
<component />
</template>
Correto
:is="currentComponent" fornece a seleção do componente; a vinculação pode mudar durante a execução.
<template>
<component :is="currentComponent" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/require-component-registration
Exigir importação ou registro explícito de componentes
Severidade padrão: warning
Predefinições: opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Consulte as opções tipadas e os valores padrão.
Liste nomes explícitos de componentes fornecidos por plugins da aplicação ou pelo previewSetup do Musea. Grafias PascalCase e kebab-case são aceitas; expressões regulares não são interpretadas. As opções não ativam a regra. Camadas posteriores substituem a lista; uma lista vazia remove os nomes herdados.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/require-component-registration": "warn"
},
"ruleOptions": {
"vue/require-component-registration": {
"globals": [
"MyButton",
"MyIcon"
]
}
}
},
},
});
vp run lint
Incorreto
MissingWidget não está registrado nem incluído na lista configurada de componentes globais permitidos.
<template>
<MissingWidget />
</template>
Correto
MyButton consta na opção globals do exemplo. Essa opção isenta um componente global conhecido; ela não o registra nem o importa.
<template>
<MyButton />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/require-scoped-style
Exigir o atributo scoped nas tags style
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/require-scoped-style": "warn"
}
},
},
});
vp run lint
Incorreto
O estilo .button não tem escopo e pode afetar elementos correspondentes fora deste componente.
<style>
.button {
color: red;
}
</style>
Correto
Adicionar scoped aplica o escopo de componente do Vue ao mesmo seletor e às mesmas declarações.
<style scoped>
.button {
color: red;
}
</style>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/require-toggle-inside-transition
Exigir uma alternância no elemento envolvido por <transition>
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/require-toggle-inside-transition": "error"
}
},
},
});
vp run lint
Incorreto
O filho estático dentro de <Transition> não tem visibilidade condicional nem seleção dinâmica para provocar uma mudança de entrada ou saída.
<template>
<transition>
<div>content</div>
</transition>
</template>
Correto
v-if="show" altera a existência do filho, fornecendo um limite de entrada ou saída à transição.
<template>
<transition>
<div v-if="show">content</div>
</transition>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/require-v-for-key
Exigir v-bind:key nas diretivas v-for
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/require-v-for-key": "error"
}
},
},
});
vp run lint
Incorreto
Cada <li> repetido não tem uma chave que identifique seu item correspondente durante atualizações da lista.
<template>
<li v-for="item in items">{{ item.name }}</li>
</template>
Correto
:key="item.id" dá a cada nó repetido a identidade do item, em vez de sua posição atual.
<template>
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/scoped-event-names
Recomendar nomes de eventos com escopo no formato context:event
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/scoped-event-names": "warn"
}
},
},
});
vp run lint
Incorreto
playAudio, pauseAudio e reloadAudio codificam seu escopo como sufixos camelCase, em vez de seguir a convenção de eventos separados por dois-pontos da regra.
<template>
<AudioPlayer
@playAudio="play"
@pauseAudio="pause"
@reloadAudio="reload"
/>
</template>
Correto
audio:play, audio:pause e audio:reload compartilham um escopo explícito audio:. O componente emissor deve usar os mesmos nomes.
<template>
<AudioPlayer
@audio:play="play"
@audio:pause="pause"
@audio:reload="reload"
/>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/sfc-element-order
Aplicar uma ordem consistente aos elementos de nível superior dos SFCs
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Consulte as opções tipadas e os valores padrão.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/sfc-element-order": "warn"
}
},
},
});
vp run lint
Incorreto
O bloco style precede o bloco script, contrariando a ordem configurada dos blocos do SFC.
<style scoped>
.panel {
color: red;
}
</style>
<script setup lang="ts">
const label = "Save";
</script>
Correto
Os blocos seguem script → template → style. Projetos podem escolher outra ordem pela opção tipada desta regra.
<script setup lang="ts">
const label = "Save";
</script>
<template>
<p>{{ label }}</p>
</template>
<style scoped>
p {
color: red;
}
</style>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/single-style-block
Recomendar um único bloco style
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/single-style-block": "warn"
}
},
},
});
vp run lint
Incorreto
O componente divide seus estilos com escopo de panel e title entre dois blocos style.
<style scoped>
.panel {
color: red;
}
</style>
<style scoped>
.title {
color: blue;
}
</style>
Correto
Os dois seletores mantêm o escopo em um único bloco style, atendendo à convenção de bloco único sem remover nenhum estilo.
<style scoped>
.panel {
color: red;
}
.title {
color: blue;
}
</style>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/slot-name-casing
Exigir kebab-case nos slots nomeados usados por v-slot
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/slot-name-casing": "warn"
}
},
},
});
vp run lint
Incorreto
O slot nomeado mySlot usa camelCase onde a regra exige um nome separado por hífen.
<template>
<MyCard><template #mySlot>Content</template></MyCard>
</template>
Correto
#my-slot usa kebab-case. Renomeie o ponto de inserção do slot correspondente para o mesmo nome.
<template>
<MyCard><template #my-slot>Content</template></MyCard>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/this-in-template
Proibir this. nas expressões do template
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/this-in-template": "warn"
}
},
},
});
vp run lint
Incorreto
As expressões do template acessam explicitamente this.message, this.className e this.handleClick, embora o Vue exponha essas variáveis diretamente.
<template>
<div>{{ this.message }}</div>
<div :class="this.className"></div>
<button @click="this.handleClick()"></button>
</template>
Correto
Use message, className e handleClick diretamente. A string literal 'this.is.a.string' permanece igual porque não é um acesso a membro.
<template>
<div>{{ message }}</div>
<div :class="className"></div>
<button @click="handleClick()"></button>
<div>{{ 'this.is.a.string' }}</div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/use-unique-element-ids
Exigir IDs de elementos únicos por meio de useId(), em vez de literais estáticos
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/use-unique-element-ids": "warn"
}
},
},
});
vp run lint
Incorreto
O ID literal email é reutilizado por todas as instâncias deste componente, o que pode direcionar seu rótulo ao elemento errado quando várias instâncias são renderizadas.
<template>
<label for="email">Email</label>
<input id="email" />
</template>
Correto
useId() produz o emailId da instância; vincule o mesmo valor ao for do rótulo e ao id do input.
<script setup>
import { useId } from "vue";
const emailId = useId();
</script>
<template>
<label :for="emailId">Email</label>
<input :id="emailId" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/use-v-on-exact
Exigir o modificador .exact em v-on quando houver manipuladores baseados em modificadores
Severidade padrão: warning
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Quando os manipuladores se sobrepõem
A regra compara listeners do mesmo evento em um elemento nativo. Ela ignora eventos de componentes personalizados, a menos que ambos os listeners usem .native. Nomes de eventos diferentes e filtros de teclado sem teclas em comum não entram em conflito.
Os modificadores de sistema indicam teclas que precisam estar pressionadas, então @keydown.alt.shift também aceita Ctrl+Alt+Shift. Se um segundo manipulador usar @keydown.alt.ctrl.shift, adicione .exact ao manipulador mais abrangente para manter essas ações separadas. .exact permite os modificadores de sistema declarados e rejeita teclas Ctrl, Shift, Alt ou Meta adicionais.
Vários modificadores de teclado são alternativas: @keydown.up.down aceita qualquer uma das duas teclas de seta. Ele pode se sobrepor a @keydown.ctrl.down em Ctrl+SetaParaBaixo. A regra reporta a chave da diretiva que precisa de .exact, excluindo sua expressão de manipulador.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/use-v-on-exact": "warn"
}
},
},
});
vp run lint
Incorreto
O manipulador de clique comum também pode executar em Ctrl-clique, sobrepondo-se ao manipulador separado .ctrl.
<template>
<button type="button" @click="handleClick" @click.ctrl="handleCtrlClick">
Save
</button>
</template>
Correto
.exact limita o manipulador de clique comum a cliques sem teclas modificadoras; o manipulador específico de Ctrl permanece separado.
<template>
<button
type="button"
@click.exact="handleClick"
@click.ctrl="handleCtrlClick"
>
Save
</button>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/v-bind-style
Aplicar um padrão de sintaxe à diretiva v-bind
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Disponível para os diagnósticos compatíveis
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Consulte as opções tipadas e os valores padrão.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/v-bind-style": "warn"
}
},
},
});
vp run lint
Incorreto
v-bind:class usa a forma longa onde o padrão de vinculação configurado exige a forma abreviada com dois-pontos.
<template>
<div v-bind:class="panelClass"></div>
</template>
Correto
:class mantém a mesma expressão com a forma abreviada exigida; esta regra trata da grafia, e não do tipo do valor.
<template>
<div :class="panelClass"></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/v-on-event-hyphenation
Exigir hífens nos nomes de eventos personalizados em v-on de componentes
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Consulte as opções tipadas e os valores padrão.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/v-on-event-hyphenation": "warn"
}
},
},
});
vp run lint
Incorreto
O listener do componente personalizado usa @myEvent em vez de um nome de evento separado por hífen.
<template>
<MyComponent @myEvent="handler" />
<MyComponent v-on:myEvent="handler" />
</template>
Correto
@my-event usa a grafia exigida para eventos personalizados. Os listeners em elementos nativos e os argumentos de evento dinâmicos mostrados abaixo ficam fora desta verificação.
<template>
<MyComponent @my-event="handler" />
<div @myEvent="handler" />
<MyComponent @[dynamicEvent]="handler" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/v-on-handler-style
Exigir manipuladores de v-on escritos como referência a método ou função inline
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/v-on-handler-style": "warn"
}
},
},
});
vp run lint
Incorreto
Os manipuladores colocam mutações e várias instruções diretamente no atributo de evento.
<template>
<button @click="count++"></button>
<button @click="doThis(); doThat()"></button>
<button @click="foo = bar"></button>
</template>
Correto
Use uma referência a manipulador ou uma expressão de função, comum ou de seta, quando for necessária lógica inline. O limite da função torna explícita a forma do manipulador.
<template>
<button @click="handler"></button>
<button @click="foo.bar"></button>
<button @click="() => count++"></button>
<button @click="function () { count++ }"></button>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/v-on-style
Aplicar um padrão de sintaxe à diretiva v-on
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Disponível para os diagnósticos compatíveis
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Consulte as opções tipadas e os valores padrão.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/v-on-style": "warn"
}
},
},
});
vp run lint
Incorreto
v-on:click usa a forma longa de listener de evento onde a regra exige a forma abreviada.
<template>
<div v-on:click="handleClick"></div>
</template>
Correto
@click mantém o mesmo manipulador e usa a forma abreviada configurada.
<template>
<div @click="handleClick"></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/v-slot-style
Aplicar um padrão de sintaxe à diretiva v-slot
Severidade padrão: warning
Predefinições: happy-path, nuxt, ecosystem, opinionated
Correção automática: Disponível para os diagnósticos compatíveis
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Consulte as opções tipadas e os valores padrão.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/v-slot-style": "warn"
}
},
},
});
vp run lint
Incorreto
O componente usa #default e o template usa v-slot:header, contrariando os padrões da regra para cada contexto.
<template>
<MyComponent #default="props">{{ props.item }}</MyComponent>
<MyComponent>
<template v-slot:header>Header</template>
</MyComponent>
</template>
Correto
Use v-slot para o slot padrão do componente e #header para o slot nomeado do template.
<template>
<MyComponent v-slot="props">{{ props.item }}</MyComponent>
<MyComponent>
<template #header>Header</template>
</MyComponent>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-attribute-name
Exigir nomes de atributos válidos
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Diagnóstico do exemplo incorreto: parser/template
A grafia malformada de um atributo é diagnosticada por parser/template antes que esta regra defensiva veja um atributo. Portanto, Bad reporta parser/template; não promete uma ocorrência separada de vue/valid-attribute-name.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-attribute-name": "error"
}
},
},
});
vp run lint
Incorreto
A aspa dentro de my"attr torna o nome do atributo malformado. Este exemplo produz o diagnóstico parser/template do parser, sem prometer um diagnóstico separado da regra.
<template>
<div my"attr="value"></div>
</template>
Correto
my-attr é um nome de atributo bem formado, então o parser do template pode ler o atributo e seu valor.
<template>
<div my-attr="value"></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-template-root
Exigir uma raiz <template> válida para a semântica de fragmentos do Vue 3
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-template-root": "error"
}
},
},
});
vp run lint
Incorreto
Um <template> aninhado comum ocupa a raiz do template sem uma diretiva que lhe dê uma função de renderização.
<template>
<template>content</template>
</template>
Correto
A <div> é um elemento raiz renderizável. Este exemplo não impõe uma restrição universal de raiz única aos fragmentos do Vue 3.
<template>
<div>content</div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-bind
Exigir diretivas v-bind válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-bind": "error"
}
},
},
});
vp run lint
Incorreto
O v-bind sem argumento não tem uma expressão de objeto, e a forma com argumento vazio não tem um nome de atributo.
<template>
<div v-bind></div>
<div :></div>
</template>
Correto
Forneça um atributo e uma expressão, vincule um objeto ou use a forma abreviada de mesmo nome do Vue 3.4+, como :loading.
<template>
<div :class="panelClass"></div>
<div v-bind="{ class: panelClass }"></div>
<div :loading></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-cloak
Exigir diretivas v-cloak válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-cloak": "error"
}
},
},
});
vp run lint
Incorreto
v-cloak recebe um valor, argumento ou modificador, embora não aceite nenhum deles.
<template>
<div v-cloak="foo"></div>
<div v-cloak:arg></div>
<div v-cloak.mod></div>
</template>
Correto
Use v-cloak sozinho; CSS pode ocultar o elemento até que o Vue remova esse atributo após a montagem.
<template>
<div v-cloak></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-else
Exigir diretivas v-else válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Disponível para os diagnósticos compatíveis
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-else": "error"
}
},
},
});
vp run lint
Incorreto
Os exemplos atribuem uma expressão a v-else, combinam-no com v-if ou omitem o ramo condicional adjacente que deve precedê-lo.
<template>
<div v-else="ready"></div>
<div v-else v-if="ready"></div>
<div v-else></div>
</template>
Correto
Coloque v-else sozinho imediatamente após o ramo v-if correspondente.
<template>
<div v-if="ready"></div>
<div v-else></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-else-if
Exigir diretivas v-else-if válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-else-if": "error"
}
},
},
});
vp run lint
Incorreto
Os exemplos deixam v-else-if sem um ramo condicional anterior ou sem condição, ou lhe dão um argumento ou modificador.
<template>
<div v-else-if="foo"></div> <!-- without preceding v-if -->
<div v-if="foo"></div><div v-else-if></div>
<div v-if="foo"></div><div v-else-if:arg="bar"></div>
<div v-if="foo"></div><div v-else-if.mod="bar"></div>
</template>
Correto
Coloque v-else-if com uma condição imediatamente após o ramo v-if ou v-else-if que ele continua.
<template>
<div v-if="foo"></div>
<div v-else-if="bar"></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-for
Exigir diretivas v-for válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-for": "error"
}
},
},
});
vp run lint
Incorreto
Os laços omitem a expressão de iteração ou adicionam o modificador .stop, que não é aceito.
<template>
<div v-for></div>
<div v-for=""></div>
<div v-for.stop="item in items"></div>
</template>
Correto
Use item in items ou (item, index) of items com uma expressão de iteração completa e as chaves mostradas.
<template>
<div v-for="item in items" :key="item.id"></div>
<div v-for="(item, index) of items" :key="index"></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-html
Exigir diretivas v-html válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-html": "error"
}
},
},
});
vp run lint
Incorreto
v-html não tem sua expressão ou usa um argumento ou modificador que esta diretiva não aceita.
<template>
<div v-html></div>
<div v-html:arg="foo"></div>
<div v-html.mod="foo"></div>
</template>
Correto
v-html="html" fornece uma expressão válida. A validade sintática não sanitiza HTML nem torna seguro conteúdo não confiável.
<template>
<div v-html="html"></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-if
Exigir diretivas v-if válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-if": "error"
}
},
},
});
vp run lint
Incorreto
As condições omitem uma expressão ou combinam v-if com uma diretiva else no mesmo nó.
<template>
<div v-if></div>
<div v-if=""></div>
<div v-if="ready" v-else></div>
</template>
Correto
Cada v-if tem uma condição não vazia, como ready ou count > 0, sem uma diretiva else incompatível.
<template>
<div v-if="ready"></div>
<div v-if="count > 0"></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-is
Exigir diretivas v-is válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-is": "error"
}
},
},
});
vp run lint
Incorreto
v-is tem um argumento ou modificador, não tem valor, ou está em um componente em vez de um elemento HTML nativo.
<template>
<tr v-is:arg="'MyRow'"></tr>
<tr v-is.mod="'MyRow'"></tr>
<tr v-is></tr>
<MyComponent v-is="'MyRow'" />
</template>
Correto
v-is com um valor em um elemento nativo como <tr> indica o componente a renderizar em seu lugar.
<template>
<tr v-is="'MyRow'"></tr>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-memo
Exigir diretivas v-memo válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-memo": "error"
}
},
},
});
vp run lint
Incorreto
v-memo sozinho não fornece ao Vue uma expressão de dependências para decidir quando reutilizar a subárvore.
<template>
<div v-memo></div>
</template>
Correto
v-memo="[valueA, valueB]" fornece o array de dependências usado para memorização.
<template>
<div v-memo="[valueA, valueB]">{{ label }}</div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-model
Exigir diretivas v-model válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-model": "error"
}
},
},
});
vp run lint
Incorreto
Uma <div> nativa não pode usar v-model como controle de formulário, e uma diretiva de input sem valor não tem uma expressão de destino gravável.
<template>
<div v-model="value"></div>
<input v-model />
</template>
Correto
Vincule o input, select, textarea ou componente personalizado às variáveis graváveis mostradas.
<template>
<input v-model="value" />
<select v-model="selected"></select>
<textarea v-model="text"></textarea>
<MyInput v-model="value" />
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-on
Exigir diretivas v-on válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Consulte as opções tipadas e os valores padrão.
Validação de modificadores
Modificadores não suportados são reportados individualmente no nome do modificador, inclusive na forma longa v-on:click, em argumentos de evento dinâmicos e na sintaxe de objeto de listeners. Os nomes aceitos correspondem aos do eslint-plugin-vue 10.9.2: modificadores de evento nativos do Vue, a tabela completa de aliases de teclas, qualquer ponto de código Unicode único e nomes com um prefixo inteiro decimal finito (conforme a semântica de Number.parseInt(name, 10) do JavaScript). Por exemplo, .13suffix é aceito por esta regra. Os diagnósticos de descontinuação de códigos numéricos de teclas e de migração de .native pertencem a regras separadas.
Apenas .stop e .prevent têm efeito sem um manipulador. Um modificador como .once, .enter ou um nome personalizado configurado ainda precisa de uma expressão de manipulador.
Projetos com tratamento personalizado de eventos podem adicionar nomes em vue.linter.ruleOptions:
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({}).withVue({
linter: {
rules: { "vue/valid-v-on": "error" },
ruleOptions: { "vue/valid-v-on": { modifiers: ["custom"] } },
},
});
Isso permite @click.custom="handler". Os nomes devem corresponder exatamente e diferenciam maiúsculas de minúsculas; as opções complementam os nomes nativos e não ativam uma regra desativada. Entradas de configuração com escopo específico podem substituir os nomes herdados por uma nova lista ou redefini-los com [].
A tabela de teclas é adaptada dos aliases de teclas do eslint-plugin-vue, licenciados sob a MIT. Seu código-fonte e sua licença são preservados junto à implementação.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-on": "error"
},
"ruleOptions": {
"vue/valid-v-on": {
"modifiers": [
"custom"
]
}
}
},
},
});
vp run lint
Incorreto
As formas de listener omitem um argumento de evento ou a expressão obrigatória de manipulador ou objeto.
<template>
<div v-on></div>
<div @></div>
<div @click></div>
<div @click.sync="handleClick"></div>
<div @click.nativeish="handleClick"></div>
<div @click.once></div>
</template>
Correto
Use um evento com seu manipulador ou passe um objeto de listeners para v-on sem argumento.
<template>
<div @click="handleClick"></div>
<form @submit.prevent></form>
<input @keyup.page-down="handlePageDown" />
<input @keyup.あ="handleKey" />
<div v-on="{ click: handleClick }"></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-once
Exigir diretivas v-once válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-once": "error"
}
},
},
});
vp run lint
Incorreto
v-once tem um valor, argumento ou modificador, embora esta diretiva seja um marcador sem valor para renderização única.
<template>
<div v-once="foo"></div>
<div v-once:arg></div>
<div v-once.mod></div>
</template>
Correto
v-once sozinho marca a subárvore para renderização única, sem sintaxe não suportada.
<template>
<div v-once></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-pre
Exigir diretivas v-pre válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-pre": "error"
}
},
},
});
vp run lint
Incorreto
v-pre tem um argumento, modificador ou valor, embora esta diretiva seja um marcador sem valor que ignora a compilação.
<template>
<div v-pre:arg></div>
<div v-pre.mod></div>
<div v-pre="foo"></div>
</template>
Correto
v-pre sozinho deixa a subárvore sem compilar, então suas interpolações são exibidas como escritas.
<template>
<div v-pre>{{ raw }}</div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-show
Exigir diretivas v-show válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-show": "error"
}
},
},
});
vp run lint
Incorreto
v-show não tem sua expressão de visibilidade ou é colocado em um <template> que não tem um elemento DOM cujo display possa ser alterado.
<template>
<div v-show></div>
<template v-show="ready"><div></div></template>
</template>
Correto
Aplique a expressão de visibilidade a um elemento renderizado, como <div>.
<template>
<div v-show="ready"></div>
<div v-show="count > 0"></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-slot
Exigir diretivas v-slot válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Consulte as opções tipadas e os valores padrão.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-slot": "error"
}
},
},
});
vp run lint
Incorreto
A diretiva de slot está em uma <div> nativa ou entra em conflito com outras declarações de slots padrão ou nomeados.
<template>
<div v-slot:header></div>
<MyComponent v-slot v-slot:header />
<template v-slot:header v-slot:footer />
</template>
Correto
Declare o slot padrão de um componente nele próprio, ou seu slot nomeado em um filho <template #header>.
<template>
<MyComponent v-slot="{ item }">{{ item }}</MyComponent>
<MyComponent>
<template #header>Header</template>
</MyComponent>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/valid-v-text
Exigir diretivas v-text válidas
Severidade padrão: error
Predefinições: essential, happy-path, nuxt, ecosystem, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-v-text": "error"
}
},
},
});
vp run lint
Incorreto
v-text não tem sua expressão de texto ou usa um argumento ou modificador que não é aceito.
<template>
<div v-text></div>
<div v-text:arg="foo"></div>
<div v-text.mod="foo"></div>
</template>
Correto
v-text="msg" é sintaticamente válido. A regra de estilo separada vue/no-v-text ainda pode preferir interpolação.
<template>
<div v-text="msg"></div>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/warn-custom-block
Alertar sobre blocos personalizados em arquivos SFC
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/warn-custom-block": "warn"
}
},
},
});
vp run lint
Incorreto
O SFC contém um bloco personalizado <i18n>, que precisa de uma integração externa além do processamento comum de template, script e style.
<i18n>
{ "en": { "hello": "Hello" } }
</i18n>
<template>
<p>{{ hello }}</p>
</template>
Correto
O exemplo usa blocos padrão de template e script setup. Este aviso opcional de portabilidade não significa que todo bloco personalizado seja inválido no Vue.
<template>
<p>{{ hello }}</p>
</template>
<script setup lang="ts">
const hello = "Hello";
</script>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.
Implementação · Todas as regras
vue/warn-custom-directive
Alertar sobre diretivas personalizadas que precisam de registro
Severidade padrão: warning
Predefinições: nuxt, opinionated
Correção automática: Nenhuma; revise a alteração sugerida
Aplicável a: Templates e blocos de SFC Vue, com o contexto do script quando exigido pela regra
Opções: Sem opções específicas da regra. A severidade e a seleção de predefinições são configuráveis.
Configuração (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/warn-custom-directive": "warn"
}
},
},
});
vp run lint
Incorreto
v-focus, v-mask e v-click-outside exigem implementações de diretivas específicas do projeto, que esta convenção opcional sinaliza.
<template>
<input v-focus />
<input v-mask="'###-####'" />
<div v-click-outside="handleClose"></div>
</template>
Correto
O exemplo usa as diretivas nativas v-if, v-model e v-on. Uma diretiva personalizada registrada corretamente ainda pode ser válida no Vue quando esta política estiver desativada.
<template>
<div v-if="ready"></div>
<input v-model="value" />
<button type="button" @click="onClick">Save</button>
</template>
O exemplo correto evita o diagnóstico desta regra com a configuração acima; outras regras ainda podem emitir diagnósticos.