Renderização Condicional com as Diretivas v-if e v-show
Diretiva v-if
A diretiva v-if
<!DOCTYPE html>
<html>
<head>
<title>Estudando Vue.js</title>
<meta charset="utf-8" />
</head>
<body>
<script src="https://unpkg.com/vue"></script>
<div id="app">
<p v-if="visible">Primeiro parágrafo</p>
<p>Segundo parágrafo</p>
<button v-on:click="visible = !visible">
{{ visible ? 'Ocultar o Primeiro parágrafo' : 'Exibir o Primeiro parágrafo' }}
</button>
</div>
<script>
Vue.createApp({
data() {
return { visible: true };
},
}).mount('#app');
</script>
</body>
</html>
A condição usada pela v-if
true
false
true
false
A alternância entre exibir ou ocultar o elemento ocorre ao clicar no botão, que altera o valor de visible


v-else
A diretiva v-else
v-if
false
<!DOCTYPE html>
<html>
<head>
<title>Estudando Vue.js</title>
<meta charset="utf-8" />
</head>
<body>
<script src="https://unpkg.com/vue"></script>
<div id="app">
<p v-if="visible">Primeiro parágrafo</p>
<p v-else>Segundo parágrafo</p>
<button v-on:click="visible = !visible">
{{ visible ? 'Ver o parágrafo 2' : 'Ver o parágrafo 1' }}
</button>
</div>
<script>
Vue.createApp({
data() {
return { visible: true };
},
}).mount('#app');
</script>
</body>
</html>
Neste caso, quando visible é true
visible
Template
Por ser uma diretiva, v-if
<template>
<!DOCTYPE html>
<html>
<head>
<title>Estudando Vue.js</title>
<meta charset="utf-8" />
</head>
<body>
<script src="https://unpkg.com/vue"></script>
<div id="app">
<template v-if="visible">
<h1>Título 1</h1>
<p>Parágrafo 1</p>
</template>
<template v-else>
<h1>Título 2</h1>
<p>Parágrafo 2</p>
</template>
<button v-on:click="visible = !visible">
{{ visible ? 'Ver o bloco 2' : 'Ver o bloco 1' }}
</button>
</div>
<script>
Vue.createApp({
data() {
return { visible: true };
},
}).mount('#app');
</script>
</body>
</html>

O elemento <template>
Se for necessário utilizar um elemento HTML explícito como contêiner, como <div>
<template>
<!DOCTYPE html>
<html>
<head>
<title>Estudando Vue.js</title>
<meta charset="utf-8" />
</head>
<body>
<script src="https://unpkg.com/vue"></script>
<div id="app">
<div v-if="visible">
<h1>Título 1</h1>
<p>Parágrafo 1</p>
</div>
<div v-else>
<h1>Título 2</h1>
<p>Parágrafo 2</p>
</div>
<button v-on:click="visible = !visible">
{{ visible ? 'Ver o bloco 2' : 'Ver o bloco 1' }}
</button>
</div>
<script>
Vue.createApp({
data() {
return { visible: true };
},
}).mount('#app');
</script>
</body>
</html>
Diretiva v-else-if
A diretiva v-else-if
v-if
<!DOCTYPE html>
<html>
<head>
<title>Estudando Vue.js</title>
<meta charset="utf-8" />
</head>
<body>
<script src="https://unpkg.com/vue"></script>
<div id="app">
<input type="number" v-model="number" />
<p v-if="number == 1">Um</p>
<p v-else-if="number == 2">Dois</p>
<p v-else-if="number > 2 && number < 7">Alguns</p>
<p v-else>Muitos</p>
</div>
<script>
Vue.createApp({
data() {
return { number: 1 };
},
}).mount('#app');
</script>
</body>
</html>

A sequência de condições é avaliada até que a primeira condição verdadeira seja atendida. Caso nenhuma das condições seja satisfeita, o bloco v-else
Também é possível utilizar a diretiva v-else-if
template
<p>
<template v-if="number == 1">Um</template>
<template v-else-if="number == 2">Dois</template>
<template v-else-if="number > 2 && number < 7">Alguns</template>
<template v-else>Muitos</template>
</p>
Diretiva v-show
A diretiva v-show
v-if
div
<!DOCTYPE html>
<html>
<head>
<title>Estudando Vue.js</title>
<meta charset="utf-8" />
</head>
<body>
<script src="https://unpkg.com/vue"></script>
<div id="app">
<div v-show="visible">
<h2>Título</h2>
<p>Texto</p>
</div>
<button v-on:click="visible = !visible">
{{ visible ? 'Ocultar' : 'Exibir' }}
</button>
</div>
<script>
Vue.createApp({
data() {
return { visible: true };
},
}).mount('#app');
</script>
</body>
</html>
O bloco div
visible
Diferenças entre v-if e v-show
A principal diferença entre v-if
v-show
v-if
v-show
display: none;
A escolha entre as duas diretivas depende do cenário. Para elementos que alternam visibilidade com frequência, v-show
v-if