Vue.js: Bind de Class & Style
Última atualização: 2026-10-20
:class e :style são os dois bindings mais comumente usados no Vue — eles permitem alternar dinamicamente nomes de classes CSS e estilos inline com base nos dados. Essencialmente, são duas formas sintáticas especiais de v-bind; por serem usados com tanta frequência, foram implementados como “açúcar sintático”.
Dominar esses 5 estilos de escrita é suficiente para cobrir 95% dos cenários: sintaxe de objetos, sintaxe de matrizes, operadores ternários, propriedades calculadas e concatenação de strings.
1. O que você vai aprender
:classSintaxe de objetos: alternar entre uma única classe e várias classes com base em condições:classSintaxe de matrizes: como aplicar várias classes simultaneamente- Misturando matrizes e objetos: combinações complexas de nomes de classes
:styleSintaxe de objetos: estilos dinâmicos embutidos:styleSintaxe de matriz: mesclagem de vários objetos de estilo- Vinculação de variáveis CSS (recomendado para o Vue 3)
2. Um desafio de estilo com uma etiqueta de status do pedido
(1) Problema: 5 estados, 5 instruções “if”
Alice precisava exibir 5 status de ordem no painel de administração com cores diferentes:
<!-- ❌ The "Broken" Version: 5 v-if with class -->
<span v-if="status === 'pending'" class="badge yellow">Pending</span>
<span v-else-if="status === 'paid'" class="badge green">Paid</span>
<span v-else-if="status === 'shipped'" class="badge blue">Shipped</span>
<span v-else-if="status === 'delivered'" class="badge gray">Delivered</span>
<span v-else class="badge red">Cancelled</span>
O gerente de produto Charlie:
“Alice, isso ficou feio. E se a gente adicionar mais três status no mês que vem? Não dá pra simplesmente copiar e colar. Precisamos de uma abordagem dinâmica e organizada.”
(2) Vue :class Solução: Lidar com 5 estados em apenas 1 linha
(3) Receita
- Redução de HTML: 5 linhas de if-else → 1 linha de :class
- Fácil de manter: Para adicionar um novo estado, basta modificar a propriedade
computed; o modelo permanece inalterado. - Legibilidade: os mapeamentos entre classes e estados estão centralizados em um único local, com uma lógica clara
3. 5 maneiras de escrever :class
(1) Sintaxe de strings
(2) Sintaxe de objetos (a mais comum)
(3) Sintaxe de matrizes
(4) Coexistência com classes estáticas
(5) Aulas sobre componentes
▶ Exemplo: 5 maneiras de escrever :class
▶ ExperimenteSaída:
String → class="badge"
Object → class="active" (isActive = true, hasError = false)
Array → class="active error"
Computed → class="active" (canEdit = true, sem cursor-not-allowed)
4. 5 maneiras de escrever :style
(1) Sintaxe de objetos
(2) Conversão de nomes de propriedades CSS
O Vue converte automaticamente as convenções de nomenclatura do JavaScript para as convenções de nomenclatura do CSS:
(3) Sintaxe de matrizes (combinação de vários objetos)
(4) Aplicação automática de prefixos
O Vue 3 adiciona automaticamente prefixos de navegador às propriedades CSS (com base no mecanismo do navegador):
// Write:
{ transform: 'rotate(45deg)' }
// Vue Auto-add:
{
-webkit-transform: 'rotate(45deg)',
transform: 'rotate(45deg)'
}
(5) Variáveis CSS (recomendado para o Vue 3)
▶ Exemplo: 5 maneiras de escrever :style
▶ ExperimenteSaída:
Object → style="color: red; font-size: 16px"
Multi → background-color #42b883, padding 20px
CSS Var → --theme-color: #35495e no elemento
Computed → cor branca, fundo #35495e, padding 20px
5. Exercício abrangente: emblema de status do pedido
▶ Exemplo: Emblema de status do pedido
▶ ExperimenteSaída:
status="paid" → <span class="order-badge bg-green">Paid</span>
status="pending" → bg-yellow / "Pending"
status desconhecido → bg-default / "Unknown"
(1) 📊 4. 5 erros comuns
| Erro | Sintoma | Solução |
|---|---|---|
| A classe String não está respondendo | A classe está codificada de forma rígida e não muda | Vinculada usando :class |
| Nome incorreto da classe de array | Várias classes com o mesmo nome se sobrescrevendo mutuamente | Uso da sintaxe de objeto |
| Unidade de estilo ausente | O número 16 é interpretado como 16px e é ignorado | A sequência de caracteres '16px' é exibida |
| Nome incorreto da propriedade CSS | font-size deveria ser fontSize |
Use camelCase ou aspas |
| :conflito de classe | Colisão de nomes estáticos e dinâmicos | O Vue os mescla automaticamente, tudo bem |
(2) 📊 5. 5 Comparações de desempenho
| Implementação | Resultado da compilação | Desempenho | Aplicabilidade |
|---|---|---|---|
| String | Concatenação direta de strings | ⭐⭐⭐⭐⭐ | Simples |
| Objeto | Análise estática | ⭐⭐⭐⭐ | Moderado |
| Matrizes | Concatenação de strings | ⭐⭐⭐⭐ | Várias classes |
| Matrizes + Objetos | Tratamento misto | ⭐⭐⭐ | Complexo |
| Propriedade calculada | Valor armazenado em cache | ⭐⭐⭐⭐⭐ | Lógica complexa |
(3) 📊 6. As 5 principais diferenças entre classe e estilo
| Aspecto | classe | estilo |
|---|---|---|
| Avaliação | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| Reutilização de CSS | Fácil (reutilização de nomes de classes) | Difícil (estilos dispersos) |
| Desempenho | Superior (otimização do navegador) | Ligeiramente inferior |
| Prioridade | Depende do seletor | Em linha (mais alta) |
| Troca de tema | Fácil (alterar classe) | Fácil (alterar variável CSS) |
❓ Perguntas Frequentes
class="x" e dinâmicas :class="{active: y}" são automaticamente combinadas (resultando em class="x active" ou "x").style precisa ser escrito como um objeto? Não posso simplesmente usar uma string de CSS?<div style="color: red"> é a sintaxe nativa do HTML, e <div :style="'color: red'"> também é uma abordagem baseada em string. No entanto, usar um objeto :style="{ color: 'red' }" permite que você vincule variáveis dinamicamente. Recomendamos o uso de um objeto.{'--my-var': value} em :style e var(--my-var) no CSS. O Vue 3 recomenda o uso de variáveis CSS para a troca de temas, pois é mais eficiente do que vincular estilos diretamente (basta atualizar uma única variável, e o DOM não será reajustado).class (comportamento padrão do Vue 3). Os componentes de raízes múltiplas usam $attrs.class para se vincular explicitamente a um elemento específico.<div v-if="show" :class="{ active: isActive }"> Quando show=false, o elemento inteiro não é renderizado, e isActive não tem efeito.:style="{ '--primary': theme.primary }" se aplica a todos os elementos color: var(--primary). Para alternar temas, basta alterar apenas uma variável, o que é mais eficiente do que alterar 100 classes.📖 Resumo
:classe:stylesão sinônimos sintáticos de v-bind; como são os mais utilizados, foram simplificados.- :class — 5 maneiras de defini-la: string, objeto, array, array + objeto, propriedade calculada
- :style — 5 maneiras de escrevê-lo: objeto, array, array + objeto, variáveis CSS, propriedades calculadas
- Fusão automática de classes estáticas e dinâmicas :class
- O Vue 3 adiciona automaticamente prefixos de CSS para navegadores
- As variáveis CSS são a solução recomendada para a troca de temas no Vue 3 (mais eficiente do que trocar estilos)
- Desempenho: Propriedades de objeto/computadas > Matrizes > Strings
📝 Exercícios
-
Questões básicas (Dificuldade: ⭐)
Use o seletor :class para implementar três estados do botão:
- principal: texto branco sobre fundo azul
- sucesso: texto branco sobre fundo verde
- perigo: texto branco sobre fundo vermelho
Dados:
const variant = ref('primary') -
Problemas avançados (Dificuldade: ⭐⭐)
Implemente uma lista de pedidos em que cada linha exiba um ícone em uma cor diferente, de acordo com o status do pedido:
- 5 status (em espera/pago/enviado/entregue/cancelado)
- Retornar um objeto
classusando uma propriedade calculada - :style Adicione a cor do ícone correspondente ao status
-
Problema desafiador (Dificuldade: ⭐⭐⭐)
Implementar um sistema completo de troca de temas:
- 3 temas (claro/escuro/alto contraste)
- Use variáveis CSS para definir as cores do tema (primária/secundária/fundo/texto)
- :class — Alterar o nome da classe do tema
- Use o localStorage para lembrar a seleção do usuário
- A troca de temas não atualiza a página (o design responsivo é atualizado automaticamente)