Capítulo 3 de 11

Tutorial VueJS 3 – Renderização condicional com v-if e v-show

verificado a 2 Setembro 2026 · 3 min

Resposta rápida

O v-if cria ou destrói o elemento, o v-show deixa-o no DOM e esconde-o com display: none. Usa o v-show para o que abre e fecha muitas vezes e o v-if para todo o resto. Os encadeamentos passam por v-else-if e v-else.

No fim deste capítulo, vais saber mostrar um elemento consoante uma condição e escolher entre v-if e v-show com conhecimento de causa.

Uma loja tem de dizer se o produto está disponível. O Vue tem duas ferramentas para mostrar ou esconder um elemento consoante uma condição: v-if e v-show. Parecem-se, mas não fazem a mesma coisa.

Preparar a condição

Acrescenta um stock ao estado do componente:

src/App.vue
<script setup>
import { ref } from 'vue'

const product = ref('T-Shirt')
const image = ref('/images/t-shirt-bleu.svg')
const inventory = ref(100)
</script>

v-if, v-else-if, v-else

O v-if coloca um elemento na página apenas se a expressão for verdadeira.

src/App.vue
<p v-if="inventory > 10">En stock</p>

Para cobrir vários casos, encadeia com v-else-if e v-else:

src/App.vue
<div class="product-info">
  <h1>{{ product }}</h1>

  <p v-if="inventory > 10">En stock</p>
  <p v-else-if="inventory > 0">Bientôt en rupture</p>
  <p v-else>En rupture</p>
</div>

Só um destes três parágrafos existe de cada vez. Põe o inventory a 5 e depois a 0, e vê a mensagem mudar.

As três diretivas têm de ser vizinhas imediatas

O v-else-if e o v-else têm de seguir diretamente o elemento que tem o v-if. Basta um comentário ou outro elemento pelo meio para o Vue avisar na consola que o v-else não tem v-if correspondente.

Condicionar vários elementos de uma vez

Para aplicar uma condição a um grupo sem acrescentar uma div inútil, põe o v-if num <template>. Esta tag não produz nada no HTML final.

html
<template v-if="inventory > 0">
  <h2>Disponible</h2>
  <p>Expédié sous 48 heures.</p>
</template>

v-show

O v-show responde à mesma necessidade, com uma mecânica diferente:

src/App.vue
<p v-show="inventory > 0">Livraison sous 48 h</p>

O elemento está sempre presente no DOM. Quando a condição é falsa, o Vue limita-se a aplicar-lhe display: none. Abre o inspetor para confirmar:

html
<!-- inventory vaut 0, avec v-if : l’élément a disparu -->
<!--v-if-->

<!-- inventory vaut 0, avec v-show : l’élément est là, masqué -->
<p style="display: none;">Livraison sous 48 h</p>

Qual escolher

A diferença está no custo da operação.

  • v-if cria e destrói o elemento e, com ele, os componentes filhos e os respetivos estados. Custo elevado na troca, custo nulo quando a condição é falsa.
  • v-show limita-se a mudar uma propriedade CSS. Custo elevado na primeira renderização, já que o elemento é sempre construído, custo quase nulo nas trocas seguintes.

Na prática: v-show para o que abre e fecha muitas vezes, como um menu ou um painel que se desdobra. v-if para todo o resto, sobretudo para o que é caro de construir ou não deve sequer existir em certos casos.

O v-show não esconde uma informação sensível

Um elemento escondido pelo v-show continua no HTML: qualquer pessoa o lê no inspetor. Para o que não deve ser visível, usa v-if e, melhor ainda, não o envies para o browser.

v-if e v-for no mesmo elemento

Não os combines na mesma tag. O ciclo v-for é o tema do capítulo seguinte. Desde o Vue 3, o v-if tem prioridade e é avaliado antes do ciclo: a variável do ciclo ainda não existe, o que provoca um erro. Põe o v-if num <template> interior, ou filtra a lista numa propriedade computada. Vamos ver as duas soluções no capítulo 7.

Na Options API

Igual. O v-if e o v-show são diretivas de template, só a declaração de inventory muda de forma.

ExercícioMostra «Só restam algumas unidades» quando inventory for inferior a 5, sem estragar as outras mensagens. Depois confirma no inspetor que um elemento escondido pelo v-show está mesmo presente no DOM.

Erros frequentes

v-else separado do seu v-if As duas diretivas têm de estar em elementos vizinhos imediatos. Basta um comentário ou uma tag pelo meio para o Vue assinalar um v-else sem v-if correspondente.
v-if e v-for na mesma tag Desde o Vue 3, o v-if é avaliado antes do v-for: a variável do ciclo ainda não existe e o Vue lança um erro. Passa o ciclo para um <template> ou filtra numa propriedade computada.
Esconder uma informação sensível com v-show O elemento continua legível no código-fonte da página. Usa v-if e, melhor ainda, não o envies para o browser.
Newsletter

Os novos testes, tutoriais e projetos, por e-mail.

Testes reproduzíveis, código versionado, resultados datados. Nunca spam.