What are the event modifiers provided by Vue?

Domina los Modificadores de Eventos en Vue.js

hace 3 años

★★★★★Valoración: 4.47 (7998 votos)

Vue.js ofrece una manera elegante y eficiente de manejar eventos del DOM directamente en tus plantillas. Una de las características más útiles para mantener tu código limpio y legible son los modificadores de eventos. Estos modificadores te permiten añadir lógica adicional al manejo de eventos directamente en la plantilla HTML, evitando tener que escribir código repetitivo o complejo en tus métodos de componente. En este artículo, exploraremos en profundidad los modificadores de eventos que Vue.js pone a tu disposición, cómo utilizarlos y cómo pueden simplificar el desarrollo de tus aplicaciones.

What is event bus in vuejs?
EventBus in Vue. js is a pattern used for communication between different components in a Vue. js application. It allows components to send and receive events without having a direct parent-child relationship.
Índice de Contenido

¿Qué son los Modificadores de Eventos en Vue.js?

En el desarrollo web moderno, es común necesitar controlar el comportamiento predeterminado de los eventos del navegador. Por ejemplo, podrías querer evitar que un enlace te redirija a una nueva página, detener la propagación de un evento a elementos padres o asegurar que un evento se ejecute solo una vez. Si bien estas acciones se pueden realizar dentro de los métodos de manejo de eventos en JavaScript, Vue.js proporciona una sintaxis más concisa y declarativa a través de los modificadores de eventos.

Los modificadores de eventos en Vue.js son sufijos que se añaden a la directiva v-on (o su forma abreviada @) mediante un punto. Estos modificadores alteran el comportamiento del evento asociado. En lugar de tener que llamar a métodos como event.preventDefault() o event.stopPropagation() dentro de tus métodos JavaScript, puedes simplemente añadir un modificador a tu directiva v-on en la plantilla.

Modificadores de Eventos Generales

Vue.js ofrece una serie de modificadores de eventos generales que cubren las necesidades más comunes en la manipulación de eventos del DOM. A continuación, exploraremos cada uno de ellos en detalle:

.stop

El modificador .stop es equivalente a llamar a event.stopPropagation() en tu método de manejo de eventos. Su función principal es detener la propagación del evento actual en la jerarquía del DOM. Esto significa que si tienes un evento que se dispara en un elemento hijo, y este evento tiene un modificador .stop, el evento no se propagará a los elementos padres.

Ejemplo:

<div @click="padreClicado"> <button @click.stop="hijoClicado">Clic en hijo (detiene propagación)</button> </div>

En este ejemplo, si haces clic en el botón, solo se ejecutará el método hijoClicado. El evento click no se propagará al div padre, por lo que el método padreClicado no se ejecutará.

.prevent

El modificador .prevent es el equivalente a llamar a event.preventDefault(). Su propósito es prevenir el comportamiento predeterminado del evento. Un caso de uso común es en formularios, donde puedes querer evitar que la página se recargue al enviar un formulario.

Ejemplo:

<form @submit.prevent="enviarFormulario"> <button type="submit">Enviar</button> </form>

Con el modificador .prevent, al hacer clic en el botón de enviar, el formulario no recargará la página como es el comportamiento predeterminado. En su lugar, se ejecutará el método enviarFormulario.

.self

El modificador .self asegura que el controlador del evento se active solo cuando el evento se emite directamente en el elemento al que está adjunto, y no desde un elemento hijo. Esto es útil para evitar que los eventos se disparen accidentalmente desde elementos anidados.

Ejemplo:

<div @click.self="divClicado"> <button @click="botonClicado">Clic en botón (no detiene .self)</button> </div>

En este caso, divClicado solo se ejecutará si haces clic directamente en el div. Si haces clic en el botón (que es un hijo del div), se ejecutará botonClicado, pero divClicado no, porque el evento original no se originó directamente en el div con el modificador .self.

.capture

El modificador .capture utiliza el modo de captura de eventos nativo del DOM. Normalmente, los eventos se procesan en la fase de 'burbuja' (bubbling), lo que significa que el evento se propaga desde el elemento más interno hacia los elementos padres. Con .capture, el evento se procesa en la fase de 'captura', lo que significa que el evento se gestiona primero por el elemento más externo en la jerarquía antes de llegar al elemento objetivo.

Ejemplo:

<div @click.capture="padreCaptura"> <button @click="hijoBurbuja">Clic en hijo</button> </div>

En este ejemplo, cuando se hace clic en el botón, primero se ejecutará padreCaptura (debido a la fase de captura) y luego hijoBurbuja (fase de burbuja). El modificador .capture es menos común, pero puede ser útil en escenarios complejos de manejo de eventos.

.once

El modificador .once asegura que el controlador de eventos se dispare como máximo una vez. Una vez que el evento se ha disparado la primera vez, el listener se elimina.

Ejemplo:

<button @click.once="clicUnaVez">Clic una vez</button>

En este caso, clicUnaVez se ejecutará solo la primera vez que se haga clic en el botón. Los clics posteriores no tendrán ningún efecto.

.passive

El modificador .passive mejora el rendimiento, especialmente en dispositivos móviles, para eventos de desplazamiento (scroll) y eventos táctiles. Indica al navegador que no tienes intención de prevenir el comportamiento predeterminado del evento (como el desplazamiento). Esto permite al navegador optimizar el rendimiento al ejecutar el controlador de eventos de forma asíncrona y sin bloquear el hilo principal.

Ejemplo:

<div @scroll.passive="onScroll">... </div>

Importante: No utilices .passive junto con .prevent, ya que .passive indica explícitamente que no se previene el comportamiento predeterminado, y el navegador puede mostrar una advertencia en la consola.

Modificadores de Teclas

Vue.js también proporciona modificadores específicos para eventos de teclado (keyup y keydown). Estos modificadores te permiten activar controladores de eventos solo cuando se presionan teclas específicas.

Alias de Teclas

Vue.js proporciona alias para las teclas de uso más común, facilitando la lectura y escritura de tus plantillas:

  • .enter - Tecla Enter
  • .tab - Tecla Tab
  • .delete - Teclas Suprimir y Retroceso (Backspace)
  • .esc - Tecla Escape (Esc)
  • .space - Tecla Espacio
  • .up - Flecha Arriba
  • .down - Flecha Abajo
  • .left - Flecha Izquierda
  • .right - Flecha Derecha

Ejemplo:

<input @keyup.enter="enviarFormulario" placeholder="Presiona Enter para enviar">

El método enviarFormulario se ejecutará solo cuando se levante la tecla Enter dentro del campo de entrada.

Nombres de Teclas Personalizados

Puedes usar directamente cualquier nombre de tecla válido expuesto por KeyboardEvent.key como modificador, convirtiéndolo a kebab-case. Por ejemplo, PageDown se convierte en page-down.

Ejemplo:

<input @keyup.page-down="paginaAbajo">

Modificadores de Teclas de Sistema

Los modificadores de teclas de sistema te permiten activar controladores de eventos de ratón o teclado solo cuando se presionan las teclas modificadoras del sistema correspondientes:

  • .ctrl - Tecla Ctrl (Control)
  • .alt - Tecla Alt (Option en Mac)
  • .shift - Tecla Shift (Mayúsculas)
  • .meta - Tecla Meta (Command en Mac, Windows en Windows)

Ejemplo:

<div @click.ctrl="hacerAlgoConCtrl">Clic con Ctrl</div> <input @keyup.alt.enter="limpiarCampoAltEnter">

hacerAlgoConCtrl se ejecutará solo cuando se haga clic mientras se mantiene presionada la tecla Ctrl. limpiarCampoAltEnter se ejecutará solo cuando se levante la tecla Enter mientras se mantiene presionada la tecla Alt.

.exact

El modificador .exact permite un control preciso de la combinación exacta de teclas de sistema necesarias para activar un evento. Asegura que el evento se active solo si las teclas modificadoras especificadas están presionadas y ninguna otra tecla modificadora del sistema lo está.

Ejemplo:

<button @click.ctrl="onClickCtrl">Clic con Ctrl (y posiblemente otras)</button> <button @click.ctrl.exact="onClickCtrlExacto">Clic con Ctrl solamente</button>

onClickCtrl se activará si se presiona Ctrl, incluso si también se presionan otras teclas modificadoras como Alt o Shift. onClickCtrlExacto solo se activará si se presiona Ctrl y ninguna otra tecla modificadora del sistema.

Modificadores de Botones de Ratón

Vue.js también ofrece modificadores para eventos de ratón que restringen el controlador a eventos disparados por un botón de ratón específico:

  • .left - Botón izquierdo del ratón
  • .right - Botón derecho del ratón
  • .middle - Botón central del ratón

Ejemplo:

<div @mousedown.right="menuContextual">Clic derecho para menú contextual</div>

menuContextual se ejecutará solo cuando se presione el botón derecho del ratón dentro del div.

Tabla Resumen de Modificadores de Eventos

ModificadorDescripciónEquivalente en JavaScript
.stopDetiene la propagación del eventoevent.stopPropagation()
.preventPreviene el comportamiento predeterminado del eventoevent.preventDefault()
.selfSolo se activa si el evento se originó en el propio elementoComprobación manual de event.target === $el
.captureUtiliza el modo de captura de eventosOpción capture: true en addEventListener
.onceEl evento se dispara como máximo una vezremoveEventListener después de la primera ejecución
.passiveMejora el rendimiento para eventos de desplazamiento y táctilesOpción passive: true en addEventListener
.enter, .tab, etc.Modificadores de alias para teclas específicasComprobación de event.key
.ctrl, .alt, .shift, .metaModificadores para teclas de sistemaComprobación de event.ctrlKey, etc.
.exactRequiere la combinación exacta de teclas de sistemaComprobación combinada de teclas de sistema
.left, .right, .middleModificadores para botones de ratónComprobación de event.button

Preguntas Frecuentes (FAQ)

  1. ¿Puedo usar varios modificadores en un mismo evento?

    Sí, puedes encadenar varios modificadores en un evento. Por ejemplo: @click.stop.prevent="hacerAlgo".

  2. ¿Importa el orden de los modificadores?

    Sí, el orden importa. Por ejemplo, @click.prevent.self previene la acción predeterminada en el elemento y sus hijos, mientras que @click.self.prevent solo previene la acción predeterminada en el propio elemento.

  3. ¿Los modificadores de eventos funcionan con todos los eventos del DOM?

    Sí, los modificadores de eventos se pueden utilizar con cualquier evento del DOM que manejes con v-on o @.

  4. ¿Puedo crear mis propios modificadores de eventos personalizados?

    No, Vue.js no permite crear modificadores de eventos personalizados directamente. Sin embargo, puedes lograr un comportamiento similar utilizando métodos de componente y lógica condicional.

Conclusión

Los modificadores de eventos en Vue.js son una herramienta poderosa y conveniente para simplificar la gestión de eventos del DOM en tus aplicaciones. Permiten mantener tus plantillas más limpias y declarativas, separando la lógica de manejo de eventos de la lógica de negocio de tus componentes. Al utilizar modificadores como .stop, .prevent, .once y los modificadores de teclas, puedes escribir código más conciso, legible y mantenible, mejorando significativamente tu flujo de desarrollo en Vue.js. Dominar estos modificadores te permitirá construir interfaces de usuario más interactivas y eficientes con menos esfuerzo.

Subir