En Vue.js la renderización condicional nos permite mostrar u ocultar elementos en función de una condición que van a ocurrir en nuestro código de JavaScript.
Por ejemplo, puedes hacer que un mensaje aparezca solo si el usuario ha iniciado sesión o que un botón solo se muestre si hay elementos en el carrito de compras.
Vue.js evalúa la condición y decide automáticamente si debe mostrar o esconder el elemento.
En Vue tenemos dos formas de hacer un render condicional v-if y v-show. Vamos a ver cada uno de ellas 👇.
Directiva v-if
La forma más habitual para mostrar o ocultar un elemento condicionalmente es la directiva v-if que nos permite renderizar un elemento en función de una expresión booleana.
- Si la expresión es verdadera, el elemento se renderizará
- Si es falsa, el elemento no se renderizará
Por ejemplo,
<div v-if="mostrarMensaje">
<p>Este mensaje se mostrará si mostrarMensaje es verdadero</p>
</div>Vamos a verlo con un ejemplo completo
<template>
<div>
<p v-if="mostrarMensaje">¡Hola, LuisLlamas.es!</p>
<button @click="toggleMensaje">Toggle Mensaje</button>
</div>
</template>
<script setup>
import { ref } from 'vue';
const mostrarMensaje = ref(true);
function toggleMensaje() {
mostrarMensaje.value = !mostrarMensaje.value;
}
</script>- El mensaje se muestra si
mostrarMensajees true. - Al hacer clic en el botón, la función
toggleMensajecambia el valor demostrarMensaje, alternando la visibilidad del mensaje.
Directivas v-else y v-else-if
Además, también podemos utilizar la directiva v-else para mostrar un elemento alternativo en caso de que la expresión sea falsa.
<div v-if="mostrarMensaje">
<p>Este mensaje se mostrará si mostrarMensaje es verdadero</p>
</div>
<div v-else>
<p>Este mensaje se mostrará si mostrarMensaje es falso</p>
</div>Incluso tenemos una directiva v-else-if si necesitamos manejar varias condiciones. Vamos a verlo con un ejemplo
<template>
<div>
<p v-if="puntaje >= 90">Excelente</p>
<p v-else-if="puntaje >= 70">Bueno</p>
<p v-else-if="puntaje >= 50">Aprobado</p>
<p v-else>Suspendido</p>
</div>
</template>
<script setup>
import { ref } from 'vue';
const puntaje = ref(85);
</script>En este ejemplo, se muestra un mensaje diferente dependiendo del valor de puntaje.
Renderizado condicional con v-show
La directiva v-show es similar a v-if, pero en lugar de ocultar el elemento del DOM, simplemente cambia su propiedad CSS display a none para ocultarlo visualmente.
Esto significa que el elemento sigue existiendo en el DOM, pero no se muestra en pantalla. Por lo demás, el uso es básicamente idéntico.
<div v-show="mostrarMensaje">
<p>Este mensaje se mostrará si mostrarMensaje es verdadero</p>
</div>En este caso,
- El elemento
<div>y su contenido se mostrarán si la variablemostrarMensajees verdadera. - Si la variable es falsa, el elemento se ocultará visualmente, pero seguirá existiendo en el DOM.
v-show no tiene un equivalente a v-else o v-else-if
Comparación entre v-if y v-show
En principio v-show y v-if pueden parecer muy similares, pero tienen usos distintos. La diferencia es cómo gestionan la visibilidad de los elementos.
| Característica | v-show | v-if |
|---|---|---|
| Visibilidad | Cambia el estilo CSS display a none | Elimina o agrega el elemento del DOM |
| Inicialización | El elemento siempre está presente en el DOM | El elemento solo se crea cuando la condición es verdadera |
| Reactividad | Suele ser más rápido | Puede ser más lento |
| Casos ideales | Mostrar/ocultar elementos frecuentemente | Mostrar/ocultar elementos bajo condiciones más específicas |
v-showes más eficiente cuando se requiere alternar la visibilidad de un elemento frecuentemente, ya que solo cambia su propiedad CSSdisplay(sin necesidad de añadir o eliminar el elemento del DOM)v-if, por otro lado, es más adecuado cuando el elemento se necesita mostrar u ocultar solo bajo ciertas condicione.
Por ejemplo, si quieres renderizar un Avatar de una persona que tiene una imagen, pero una persona no tiene imagen y no la quieres, podríamos usar v-if. Porque el componente “no quiere / no necesita” la imagen.
Pero si quisieras enseñar un indicador cuando pasa algo en tu aplicación, usaríamos v-show. Porque el componente “si quiere” el indicador, pero lo tiene apagado.