Intro


Vamos a hablar sobre el «renderizado condicional» de HTML. ¿Y esto qué es? Pues la posibilidad de mostrar un trozo de HTML según una condición JS, así de simple.

En nuestro caso vamos a mostrar un texto (Conectado|Desconectado) basado en una nueva variable que crearemos en nuestro data(). Como siempre Vue nos ayuda a ello de una manera muy simple, otra vez a través de unas cuantas directivas, en este caso serán v-if, v-else y v-else-if

Directiva v-if


Vamos a empezar por añadir a nuestro index.html dos etiquetas p cada una con un texto diferente (conectado, desconectado).

[html title=»index.html» firstline=»17″ highlights=»19,20″]
<div class="player-info">
<h1>{{ player }}</h1>
<p>Conectado</p>
<p>Desconectado</p>
</div>
[/html]

Mostrar una u otra dependerá de la variable isOnline que añadiremos a nuestro data()

[js title=»app.js» hightlight=»6″]
const app = Vue.createApp({
data() {
return {
player: ‘Héctor Menduíña Hermelo’,
imgSrc: ‘./assets/img/avatar-1.png’,
isOnline: true
}
}
})
[/js]

Podemos añadir la directiva v-if a un elemento para decidir si lo mostramos o no dependiendo de una condición JS. En este caso nuestra variable isOnline.

[html title=»index.html» firstline=»19″]
<p v-if="isOnline">Conectado</p>
[/html]

Esa linea quiere decir que esa etiqueta p solo se renderizará en caso que isOnline sea verdadera.

La magia viene aquí, con v-if podemos combinar v-else para mostrar otro HTML cuando isOnline sea falsa.

[html title=»index.html» firstline=»19″]
<p v-if="isOnline">Conectado</p>
<p v-else>Desconectado</p>
[/html]

Si cambiamos el valor de la variable isOnline = false veremos que el texto renderizado será «Desconectado»

v-if vs v-show


No siempre se necesita emparejar v-if con v-else. Hay infinidad de casos donde no se suele necesitar v-else. En estos casos, suele ser mejor opción utilizar la directiva v-show.

[html title=»index.html»]
<p v-show="isOnline">Conectado</p>
[/html]

La directiva v-show su utiliza para intercambiar (mostrar/ocultar) la visibilidad de un elemento en lugar de añadir y eliminar el elemento al DOM como hace v-if.

Esto es una consecuencia importante, como puedes imaginar, por motivos de performance, es más eficaz v-show cuando es algo que se muestra y oculta con mucha frecuencia. Al usar v-show el HTML se renderiza siempre en el DOM, pero se oculta con un estilo en linea display: none; que Vue añade por nosotros (puedes comprobarlo inspeccionando el elemento en el navegador).

v-else-if


Vamos a ver como podemos encadenar capas de lógica a nuestro v-if/v-else.

Vamos a cambiar la variable isOnline por status que tendrá dos propiedades: isOnline y coverage para simular la cantidad de cobertura del player.

De esta manera, como ahora nuestra condición coverage es un integer, podemos utilizar algo más de lógica en nuestra expresión JS.

[js title=»app.js» hightlight=»6-9″]
const app = Vue.createApp({
data() {
return {
player: ‘Héctor Menduíña Hermelo’,
imgSrc: ‘./assets/img/avatar-1.png’,
status: {
isOnline: true,
coverage: 83
}
}
}
})
[/js]

[html title=»index.html» firstline=»21″]
<p v-if="status.coverage > 80">Buena conexión</p>
<p v-else-if="status.coverage <= 80 && status.coverage > 30">Normal</p>
<p v-else>Mala conexión</p>
[/html]

La directiva v-else-if nos da una capa intermedia de lógica. Dependiendo del valor de status.coverage mostraremos un HTML u otro. El resultado final después de esta lección debería ser algo como esto (ver imagen).


0 comentarios

Dejar un comentario

¿Quieres unirte a la conversación?
Siéntete libre de contribuir!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

doce + 18 =