- Impara
-
Ecosistema
Aiuto
Tooling
Librerie Core
Novità
Risorse
- Team
- Supporta Vue
- Traduzioni
Guide
Essenziale
- Installation
- Introduction
- The Vue Instance
- Template Syntax
- Computed Properties and Watchers
- Class and Style Bindings
- Conditional Rendering
- List Rendering
- Event Handling
- Form Input Bindings
- Components
Animazioni e transizioni
- Enter/Leave & List Transitions
- State Transitions
Riusabilità e Composizione
- Mixins
- Custom Directives
- Render Functions & JSX
- Plugins
- Filters
Tooling
- Production Deployment
- Single File Components
- Unit Testing
- TypeScript Support
Scaling Up
- Routing
- State Management
- Server-Side Rendering
Internals
- Reactivity in Depth
Migrazioni
- Migration from Vue 1.x
- Migration from Vue Router 0.7.x
- Migration from Vuex 0.6.x to 1.0
Meta
- Comparison with Other Frameworks
- Join the Vue.js Community!
- Meet the Team
Event Handling
Listening to Events
We can use the v-on
directive to listen to DOM events and run some JavaScript when they’re triggered.
For example:
<div id="example-1"> |
var example1 = new Vue({ |
Result:
The button above has been clicked {{ counter }} times.
Method Event Handlers
The logic for many event handlers will be more complex though, so keeping your JavaScript in the value of the v-on
attribute isn’t feasible. That’s why v-on
can also accept the name of a method you’d like to call.
For example:
<div id="example-2"> |
var example2 = new Vue({ |
Result:
Methods in Inline Handlers
Instead of binding directly to a method name, we can also use methods in an inline JavaScript statement:
<div id="example-3"> |
new Vue({ |
Result:
Sometimes we also need to access the original DOM event in an inline statement handler. You can pass it into a method using the special $event
variable:
<button v-on:click="warn('Form cannot be submitted yet.', $event)"> |
// ... |
Event Modifiers
It is a very common need to call event.preventDefault()
or event.stopPropagation()
inside event handlers. Although we can do this easily inside methods, it would be better if the methods can be purely about data logic rather than having to deal with DOM event details.
To address this problem, Vue provides event modifiers for v-on
. Recall that modifiers are directive postfixes denoted by a dot.
.stop
.prevent
.capture
.self
.once
<!-- the click event's propagation will be stopped --> |
Order matters when using modifiers because the relevant code is generated in the same order. Therefore using @click.prevent.self
will prevent all clicks while @click.self.prevent
will only prevent clicks on the element itself.
New in 2.1.4+
<!-- the click event will be triggered at most once --> |
Unlike the other modifiers, which are exclusive to native DOM events, the .once
modifier can also be used on component events. If you haven’t read about components yet, don’t worry about this for now.
New in 2.3.0+
<!-- the scroll event will not cancel the default scroll behavior --> |
In addition to these modifiers, Vue provides .passive
modifier to improve the performance on mobile especially. For example, when performing a scroll, the browser will scroll after the process has completed because the browser doesn’t know if the event is going to call event.preventDefault()
within its handler. .passive
modifier can be used to tell the browser that this event will not cancel the default event behavior in advance.
Don’t use .passive
and .prevent
together. Passive handler can’t prevent default event.
Key Modifiers
When listening for keyboard events, we often need to check for common key codes. Vue also allows adding key modifiers for v-on
when listening for key events:
<!-- only call `vm.submit()` when the `keyCode` is 13 --> |
Remembering all the keyCode
s is a hassle, so Vue provides aliases for the most commonly used keys:
<!-- same as above --> |
Here’s the full list of key modifier aliases:
.enter
.tab
.delete
(captures both “Delete” and “Backspace” keys).esc
.space
.up
.down
.left
.right
You can also define custom key modifier aliases via the global config.keyCodes
object:
// enable `v-on:keyup.f1` |
Automatic Key Modifers
New in 2.5.0+
You can also directly use any valid key names exposed via KeyboardEvent.key
as modifiers by converting them to kebab-case:
<input @keyup.page-down="onPageDown"> |
In the above example, the handler will only be called if $event.key === 'PageDown'
.
A few keys (.esc
and all arrow keys) have inconsistent key
values in IE9, their built-in aliases should be preferred if you need to support IE9.
System Modifier Keys
New in 2.1.0+
You can use the following modifiers to trigger mouse or keyboard event listeners only when the corresponding modifier key is pressed:
.ctrl
.alt
.shift
.meta
Note: On Macintosh keyboards, meta is the command key (⌘). On Windows keyboards, meta is the windows key (⊞). On Sun Microsystems keyboards, meta is marked as a solid diamond (◆). On certain keyboards, specifically MIT and Lisp machine keyboards and successors, such as the Knight keyboard, space-cadet keyboard, meta is labeled “META”. On Symbolics keyboards, meta is labeled “META” or “Meta”.
For example:
<!-- Alt + C --> |
Note that modifier keys are different from regular keys and when used with keyup
events, they have to be pressed when the event is emitted. In other words, keyup.ctrl
will only trigger if you release a key while holding down ctrl
. It won’t trigger if you release the ctrl
key alone.
.exact
Modifier
New in 2.5.0+
The .exact
modifier allows control of the exact combination of system modifiers needed to trigger an event.
<!-- this will fire even if Alt or Shift is also pressed --> |
Mouse Button Modifiers
New in 2.2.0+
.left
.right
.middle
These modifiers restrict the handler to events triggered by a specific mouse button.
Why Listeners in HTML?
You might be concerned that this whole event listening approach violates the good old rules about “separation of concerns”. Rest assured - since all Vue handler functions and expressions are strictly bound to the ViewModel that’s handling the current view, it won’t cause any maintenance difficulty. In fact, there are several benefits in using v-on
:
It’s easier to locate the handler function implementations within your JS code by skimming the HTML template.
Since you don’t have to manually attach event listeners in JS, your ViewModel code can be pure logic and DOM-free. This makes it easier to test.
When a ViewModel is destroyed, all event listeners are automatically removed. You don’t need to worry about cleaning it up yourself.