Skip to content
← Todas las preguntas
🌱 Principiante

¿Qué es el renderizado condicional en Vue?

📌 Directivas

El renderizado condicional controla si los elementos aparecen en el DOM según el estado reactivo. Vue ofrece dos mecanismos: v-if (añade o elimina elementos) y v-show (alterna la propiedad CSS display).

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

Estas directivas añaden o eliminan elementos del DOM por completo.

vue
<template>
  <div v-if="status === 'loading'">Loading...</div>
  <div v-else-if="status === 'error'">Something went wrong</div>
  <div v-else>{{ data }}</div>
</template>

<script setup>
import { ref } from 'vue'

const status = ref('loading')
const data = ref(null)
</script>
Open in Vue Playground

Los elementos deben ser hermanos. No puedes poner otros elementos entre v-if y v-else:

vue
<!-- Incorrecto: el <hr> rompe la cadena -->
<div v-if="ok">Yes</div>
<hr />
<div v-else>No</div>

<!-- Correcto: hermanos, sin separación -->
<div v-if="ok">Yes</div>
<div v-else>No</div>
Open in Vue Playground

v-if en template

Para renderizar condicionalmente varios elementos sin añadir un wrapper al DOM:

vue
<template v-if="loggedIn">
  <h1>Welcome back</h1>
  <p>Your dashboard is ready</p>
</template>
Open in Vue Playground

v-show

v-show mantiene el elemento en el DOM y alterna display: none.

vue
<div v-show="isVisible">Always in the DOM, just hidden</div>
Open in Vue Playground

v-if frente a v-show

v-ifv-show
Comportamiento en el DOMAñade/elimina elementosAlterna display: none
Coste de renderizado inicialMás barato si la condición es false (no renderiza nada)Siempre se renderiza
Coste al alternarCaro (destruye y vuelve a crear)Barato (solo CSS)
Soporta <template>No
Soporta v-elseNo
Dispara lifecycle hooksSí, en cada alternanciaSolo en el primer renderizado

Regla general: usa v-show para cosas que el usuario alterna con frecuencia (pestañas, desplegables, tooltips). Usa v-if para condiciones que raramente cambian o cuando quieres evitar el coste de renderizado inicial.

Problema común: v-if con v-for

Nunca pongas v-if y v-for en el mismo elemento. En Vue 3, v-if tiene mayor precedencia, así que se ejecuta antes que v-for y no puede acceder a la variable de iteración.

vue
<!-- Incorrecto: v-if no puede ver "item" -->
<li v-for="item in items" v-if="item.active" :key="item.id">
  {{ item.name }}
</li>

<!-- Correcto: filtra con computed -->
<li v-for="item in activeItems" :key="item.id">
  {{ item.name }}
</li>
Open in Vue Playground
ts
const activeItems = computed(() => items.value.filter((i) => i.active))

Ver también: ¿Cuál es la diferencia entre v-if y v-show? · ¿Por qué no debes usar v-if con v-for?

Referencias

Publicado bajo la licencia MIT.