Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Vue 3 debugging reference for reactivity issues, computed errors, watcher bugs, async failures, and SSR hydration problems.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
reference/event-modifier-order-matters.md
1---2title: Event Modifier Order Matters3impact: MEDIUM4impactDescription: Modifier order affects event handling behavior - wrong order causes unexpected propagation or prevention5type: gotcha6tags: [vue3, events, modifiers, v-on, click, form]7---89# Event Modifier Order Matters1011**Impact: MEDIUM** - When chaining event modifiers, the order determines behavior because Vue generates code in the same sequence. Using `.prevent.self` vs `.self.prevent` produces different results that can cause subtle bugs in event handling.1213## Task Checklist1415- [ ] Always consider modifier order when chaining multiple modifiers16- [ ] Use `.prevent.self` to prevent default on element AND children17- [ ] Use `.self.prevent` to prevent default ONLY on the element itself18- [ ] Test event behavior on both the element and its children1920**Incorrect:**21```html22<!-- WRONG: Unintended behavior - prevents clicks on children too -->23<template>24<div @click.prevent.self="handleClick">25<button>Child Button</button> <!-- Default also prevented here! -->26</div>27</template>28```2930```html31<!-- WRONG: Assuming order doesn't matter -->32<template>33<!-- Developer expects only self clicks to be handled -->34<!-- But .prevent runs first, affecting all clicks -->35<a href="/page" @click.prevent.self="navigate">36<span>Click me</span>37</a>38</template>39```4041**Correct:**42```html43<!-- CORRECT: Only prevent default on the element itself -->44<template>45<div @click.self.prevent="handleClick">46<button>Child Button</button> <!-- Default NOT prevented here -->47</div>48</template>49```5051```html52<!-- CORRECT: Prevent default on element and children -->53<template>54<form @submit.prevent.self="onSubmit">55<button type="submit">Submit</button>56</form>57</template>58```5960```html61<!-- CORRECT: Explicit intent with separate handlers when needed -->62<template>63<div @click.self="handleSelfClick">64<button @click.prevent="handleChildClick">65Child with prevented default66</button>67</div>68</template>69```7071## How Modifier Order Works7273```javascript74// Vue compiles modifiers in order, so:7576// @click.prevent.self compiles to:77// event.preventDefault()78// if (event.target !== event.currentTarget) return79// handler()8081// @click.self.prevent compiles to:82// if (event.target !== event.currentTarget) return83// event.preventDefault()84// handler()85```8687## Common Modifier Combinations8889```html90<!-- Stop propagation AND prevent default -->91<a @click.stop.prevent="handleClick">Link</a>9293<!-- Capture mode with once -->94<div @click.capture.once="handleOnce">...</div>9596<!-- Only exact modifier key combination -->97<button @click.ctrl.exact="onCtrlClick">Ctrl+Click Only</button>98```99100## Reference101- [Vue.js Event Handling - Event Modifiers](https://vuejs.org/guide/essentials/event-handling.html#event-modifiers)102