vuejs-render-condicional

Render condicional en Vue.js

  • 3 min

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 mostrarMensaje es true.
  • Al hacer clic en el botón, la función toggleMensaje cambia el valor de mostrarMensaje, 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 variable mostrarMensaje es 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ísticav-showv-if
VisibilidadCambia el estilo CSS display a noneElimina o agrega el elemento del DOM
InicializaciónEl elemento siempre está presente en el DOMEl elemento solo se crea cuando la condición es verdadera
ReactividadSuele ser más rápidoPuede ser más lento
Casos idealesMostrar/ocultar elementos frecuentementeMostrar/ocultar elementos bajo condiciones más específicas
  • v-show es más eficiente cuando se requiere alternar la visibilidad de un elemento frecuentemente, ya que solo cambia su propiedad CSS display (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.