En este post aprenderás a mostrar un modal personalizado usando Bulma a través de Buefy. De este modo podrás mostrar una ventana superpuesta o lo que se conoce como un modal.
Por cierto, vamos a usar componentes y propiedades de los mismos para separar los conceptos.
Te invito a repasar la comunicación entre componentes y cómo usar Buefy.
El modal va a estar en otro componente. Esto es para separar conceptos y tener un código separado. Entonces tenemos el componente que será el modal:
<template>
<div class="modal-card" style="width: auto">
<header class="modal-card-head">
<p class="modal-card-title">Cobrar</p>
</header>
<section class="modal-card-body">
{{ dispositivo }}
</section>
<footer class="modal-card-foot">
<b-button @click="cobrar()" type="is-success">Ok</b-button>
<b-button @click="cerrar()">Cancelar</b-button>
</footer>
</div>
</template>
<script>
export default {
props: ["dispositivo"],
methods: {
cerrar() {
this.$parent.close();
},
cobrar() {
const costo = 1;
if (costo <= 0) {
return;
}
this.$emit("cobrado", costo);
},
},
};
</script>
Lo que te muestro es un ejemplo, pero sirve para mostrarte cómo puedes hacerlo. Tenemos un div con la clase modal-card
, que tiene un header
con la clase modal-card-head
, un cuerpo con la clase modal-card-body
y el footer
con la clase modal-card-foot
.
También tiene dos botones, uno es para confirmar la acción y otro para cerrar el modal. Para cerrar el modal invocamos a this.$parent.close
.
En este caso como ejemplo estoy recibiendo la propiedad dispositivo
, esto es para ejemplificar que podemos pasarle propiedades desde el padre. Y también estoy emitiendo el evento cobrado
para que el padre lo escuche.
Obviamente todo el componente puede tener más métodos, propiedades, diseño, etcétera.
Ahora que ya tenemos nuestro modal vamos a importarlo en el padre e indicar que lo vamos a usar dentro de components
.
Comenzamos importándolo:
import DialogoCobrar from "./DialogoCobrar.vue";
Y luego indicamos que vamos a usarlo:
export default {
components: { DialogoCobrar },
}
Ahora en nuestra plantilla (igual en el padre) vamos a usarlo dentro de un b-modal
así:
<template>
<b-modal
:active.sync="mostrarModalCobrar"
aria-modal
aria-role="dialog"
has-modal-card
:destroy-on-hide="true"
trap-focus
>
<dialogo-cobrar
@cobrado="onCobrado"
:dispositivo="dispositivoParaCobrar"
/>
</b-modal>
</template>
Y fíjate en todas las variables que le estamos pasando (las explico más adelante). Vamos a mostrar y ocultar el modal a través de la variable mostrarModalCobrar
.
También le estamos pasando la propiedad dispositivo
a través de la variable dispositivoParaCobrar
.
Finalmente estamos escuchando en evento cobrado
, en el cual invocamos a la función onCobrado
.
Ahora solo falta mostrar y ocultar nuestro modal. Entonces en data
definimos las 3 variables anteriores, y en methods
colocamos el método que será llamado cuando el modal emita el evento:
export default {
components: { DialogoCobrar },
data: () => ({
mostrarModalCobrar: false,
dispositivoParaCobrar: {},
}),
methods: {
onCobrado(costo) {
console.log({ costo });
},
}
}
En este caso solo estoy imprimiendo la variable que se nos va a pasar desde el modal dentro de nuestro método. Y finalmente lo que desencadena y muestra el modal (modificando la bandera mostrarModalCobrar
) es lo siguiente:
// Llamado para terminar de rentar un equipo con tiempo límite
async cobrar(dispositivo) {
console.log({ dispositivo });
this.dispositivoParaCobrar = dispositivo;
this.mostrarModalCobrar = true;
}
Entonces cuando esta función sea invocada se va a colocar el dispositivo para cobrar, mismo que ya está pasado al componente. Luego se va a mostrar el modal, y el paso siguiente será escuchar el evento cobrado
que ya vimos anteriormente.
Ya te dije anteriormente: esto es solo un ejemplo; puedes adaptarlo a tus necesidades. Yo escribo este post como recordatorio.
Básicamente debes modificar la bandera para mostrar y ocultar el modal. Y desde el modal puedes pasar datos o cerrar al mismo desde adentro. Además, puedes reutilizar el modal y muchas cosas más.
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…
Esta web usa cookies.