--- title: Never Use .passive and .prevent Together impact: HIGH impactDescription: Conflicting modifiers cause .prevent to be ignored and trigger browser warnings type: gotcha tags: [vue3, events, modifiers, scroll, touch, performance] --- # Never Use .passive and .prevent Together **Impact: HIGH** - The `.passive` modifier tells the browser you will NOT call `preventDefault()`, while `.prevent` does exactly that. Using them together causes `.prevent` to be ignored and triggers browser console warnings. This is a logical contradiction that leads to broken event handling. ## Task Checklist - [ ] Never combine `.passive` and `.prevent` on the same event - [ ] Use `.passive` for scroll/touch events where you want better performance - [ ] Use `.prevent` when you need to stop the default browser action - [ ] If you need conditional prevention, handle it in JavaScript without `.passive` **Incorrect:** ```html ``` ```html ``` ```html ``` **Correct:** ```html ``` ```html ``` ```html ``` ## Understanding .passive ```javascript // .passive tells the browser: // "I promise I won't call preventDefault()" // This allows the browser to: // 1. Start scrolling immediately without waiting for JS // 2. Improve scroll performance, especially on mobile // 3. Reduce jank and stuttering // Equivalent to: element.addEventListener('scroll', handler, { passive: true }) ``` ## When to Use .passive ```html
``` ## When to Use .prevent (Without .passive) ```html
``` ## Browser Warning When you combine `.passive` and `.prevent`, the browser console shows: ``` [Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. ``` ## Reference - [Vue.js Event Handling - Event Modifiers](https://vuejs.org/guide/essentials/event-handling.html#event-modifiers) - [MDN - Improving scroll performance with passive listeners](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#improving_scrolling_performance_with_passive_listeners)