Vue 3 Foundations
Thème :
Junior
1 vues ·14/24 leçons

Les Modificateurs d’Événements (Event Modifiers)

Les modificateurs d’événements sont des suffixes spéciaux (mots-clés) qui permettent de manipuler le comportement standard des événements HTML, directement depuis le template. Ils vous évitent d’avoir à écrire les barbants event.preventDefault() ou event.stopPropagation() à l’intérieur de vos fonctions JavaScript.

Les Modificateurs d’Événement Courants

.prevent - Empêcher le Comportement par Défaut

<template>
    <!-- SANS modificateur -->
    <form @submit="handleSubmit">
        <!-- Obligation d'ajouter event.preventDefault() dans handleSubmit pour empêcher la page de recharger -->
    </form>

    <!-- AVEC modificateur - Tellement plus propre ! -->
    <!-- La soumission classique (rechargement) du formulaire est instantanément bloquée -->
    <form @submit.prevent="handleSubmit"></form>

    <!-- Empêcher le comportement sans même exécuter de fonction derrière -->
    <form @submit.prevent></form>

    <!-- Empêcher un lien <a> de nous rediriger ailleurs -->
    <a href="/" @click.prevent="handleClick">Rester sur cette page et exécuter du JS</a>
</template>

.stop - Stopper la Propagation (Bubbling)

<script setup>
function handleParentClick() {
    console.log('Parent cliqué');
}

function handleChildClick() {
    console.log('Enfant cliqué');
}
</script>

<template>
    <!-- Un clic à l'intérieur déclenche ça : -->
    <div @click="handleParentClick" class="parent">
        <!-- SANS .stop, cliquer sur ce bouton loguera "Enfant cliqué" PUIS "Parent cliqué" (Remontée / Bubbling) -->
        <button @click="handleChildClick">Normal</button>

        <!-- AVEC .stop, SEUL l'enfant s'exécutera. L'événement est tué avant de remonter à la DIV parente. -->
        <button @click.stop="handleChildClick">Stoppé</button>
    </div>
</template>

.once - Se déclencher UNE SEULE fois

<template>
    <!-- Le gestionnaire ne s'exécutera que lors du TOUT PREMIER clic -->
    <button @click.once="showWelcome">Afficher la Bienvenue</button>

    <!-- Très pratique pour des initialisations uniques (comme lancer une vidéo) -->
    <video @play.once="trackVideoStart" />
</template>

.self - Déclencher uniquement sur l’élément exact

<template>
    <!-- L'événement 'click' doit provenir exactement de CETTE <div> pure, et pas de ses balises enfants -->
    <div @click.self="handleDivClick" class="container">
        <button>Cliquer ici ne déclenchera PAS le click sur la div parente</button>
        <p>Cliquer ici non plus</p>
    </div>
</template>

.capture - Utiliser le Mode Capture

<template>
    <!-- Capture l'événement en "descente" (phase capture de JS), donc AVANT l'élément interne affecté -->
    <div @click.capture="handleCapture">
        <button @click="handleClick">Cliquer</button>
    </div>
    <!-- handleCapture s'exécutera TOUJOURS AVANT a fonction handleClick ! -->
</template>

.passive - Améliorer les Performances de Scroll

<template>
    <!-- Indique au navigateur qu'on ne fera JAMAIS de preventDefault(), accélérant le défilement ! -->
    <div @scroll.passive="onScroll">Un très long contenu défilant...</div>

    <!-- Extrêmement utile pour les événements tactiles sur mobile -->
    <div @touchmove.passive="onTouchMove">...</div>
</template>

Chaîner les Modificateurs

Vous pouvez parfaitement assembler plusieurs modificateurs les uns à la suite des autres :

<template>
    <!-- Stoppe la propagation ET Empêche la redirection -->
    <a @click.stop.prevent="handleClick" href="/">Lien</a>

    <!-- Ne se lance qu'une seule fois ET Empêche la redirection -->
    <form @submit.once.prevent="handleSubmit">...</form>

    <!-- L'ordre importe ! ".self.prevent" n'empêchera le comportement que si le clic est SUR l'élément lui-même -->
    <div @click.self.prevent="onClick">...</div>
</template>

Les Modificateurs de Clavier (Key Modifiers)

Une des killer features de Vue : écouter des touches précises du clavier hyper facilement :

<template>
    <!-- Les touches classiques fréquentes -->
    <input @keyup.enter="submit" />
    <!-- Touche "Entrée" -->
    <input @keyup.tab="nextField" />
    <!-- Tabulation -->
    <input @keyup.delete="clearInput" />
    <!-- Captent Delete ET Retour Arrière ! -->
    <input @keyup.esc="cancel" />
    <!-- Touche Échap -->
    <input @keyup.space="togglePlay" />
    <!-- Barre d'Espace -->

    <!-- Flèches directionnelles -->
    <input @keyup.up="previousItem" />
    <input @keyup.down="nextItem" />
    <input @keyup.left="goBack" />
    <input @keyup.right="goForward" />
</template>

Les Touches Systèmes

<template>
    <!-- Combos avec Ctrl / Cmd -->
    <input @keyup.ctrl.enter="submitForm" />
    <!-- Ctrl + Entrée -->
    <input @keyup.meta.s="saveDocument" />
    <!-- Cmd sur Mac / Touche Windows sur PC  -->
    <input @keyup.alt.a="selectAll" />
    <input @keyup.shift.tab="previousField" />

    <!-- Combiner plusieurs touches de contrôle en même temps !! -->
    <input @keyup.ctrl.shift.s="saveAs" />
</template>

Le Modificateur .exact

Exige que SEULEMENT la stricte combinaison demandée soit pressée, aucune autre touche parasite :

<template>
    <!-- Se déclenche même si Alt ou Shift sont pressées en même temps que Ctrl -->
    <button @click.ctrl="onClick">A</button>

    <!-- Se déclenche UNIQUEMENT si SEUL Ctrl est pressé, et rien d'autre -->
    <button @click.ctrl.exact="onCtrlClick">A</button>

    <!-- Se déclenche UNIQUEMENT si AUCUNE touche spéciale (ctrl/alt/shift) n'est pressée -->
    <button @click.exact="onClick">A</button>
</template>

Modificateurs pour les Clics de Souris

<template>
    <!-- N'écouter que certains boutons précis de la souris -->
    <button @click.left="onLeftClick">Clic Gauche (Par défaut)</button>
    <button @click.right="onRightClick">Clic Droit</button>
    <button @click.middle="onMiddleClick">Clic Molette centrale</button>

    <!-- Bloquer le menu par défaut natif de Windows lors d'un vrai clic droit -->
    <div @contextmenu.prevent="showCustomMenu">Faites un clic droit pour ouvrir MON propre menu personnalisé !</div>
</template>

Cas Pratique : Navigation Totale au Clavier d’une Liste

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

const items = ref(['Accueil', 'À Propos', 'Contact', 'Aide']);
const selectedIndex = ref(0); // On traque l'élément actuellement sélectionné

function selectPrevious() {
    if (selectedIndex.value > 0) {
        selectedIndex.value--;
    }
}

function selectNext() {
    if (selectedIndex.value < items.value.length - 1) {
        selectedIndex.value++;
    }
}

function activateItem() {
    console.log('Section confirmée :', items.value[selectedIndex.value]);
}
</script>

<template>
    <!-- Un composant de menu génial, 100% navigable au clavier de manière accessible ! -->
    <ul tabindex="0" @keyup.up.prevent="selectPrevious" @keyup.down.prevent="selectNext" @keyup.enter="activateItem">
        <li v-for="(item, index) in items" :key="item" :class="{ selected: index === selectedIndex }" @click="selectedIndex = index">
            {{ item }}
        </li>
    </ul>
</template>

Ressources


📘 Cette leçon fait partie du cours Fondamentaux de Vue.js sur la plateforme d’apprentissage RostoDev.

Prêt à passer à la suite ?

Vous avez terminé cette leçon sur Les Modificateurs d'Événements (Event Modifiers). Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.