Hello everyone, it’s me again, lately the project is coding Vue, I did a post to share some knowledge points about Vue. When you build a dynamic
website with Vue, you will most likely want to add, edit, delete, open dialog, close dialog, and so on. For example, if you click on a button to submit a form or mouse movement event, for example, you want the website to be able to respond to something like show confirmation, or hover displaying the text. So today I will talk about how to handle events (events) in Vue.
Handling events in Vue
For example, I can block events by adding a v-on
directive to the DOM element. In general, I want to handle the button element click event, then we can add the following
1 2 | <span class="token operator"><</span> button v <span class="token operator">-</span> on <span class="token operator">:</span> click <span class="token operator">=</span> <span class="token string">"handleSubmit"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> button <span class="token operator">></span> |
Notice we add the parameter after the v-on
directive, which tells Vue this is the name of the event type we want to handle, in our case it’s the click
event.
Then I will bind the click event handler method, in this case it is handleSubmit
.
Note: v-on
directive can be more concise with @
syntax as follows:
1 2 | <span class="token operator"><</span> button @click <span class="token operator">=</span> <span class="token string">"handleSubmit"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> button <span class="token operator">></span> |
Events handle types
Besides click
events, how can other DOM events be handled in Vue? The question will surely have the answer: Vue can handle any form of web or mobile native event as well as custom event
including the following:
- submit
- keyup
- drag
- scroll
You can refer to the list of popular DOM Events here, I just listed some of them above.
Event Handling Method
If we bind a method after the event name, then we can run the code you write in that method.
For example, as simple as you want to print out a message console, you can do the following
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token operator"><</span> template <span class="token operator">></span> <span class="token operator"><</span> button v <span class="token operator">-</span> on <span class="token operator">:</span> click <span class="token operator">=</span> <span class="token string">"handleSubmit"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> button <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> template <span class="token operator">></span> <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> methods <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">handleSubmit</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"You clicked the button!"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
How to use the Event Object
As you know, when an event occurs, the javascript will create an event
object, it contains information related to the event such as the mouse position relative to the browser, the position of the mouse relative to the current element. emitting the event. In Vue, when we use directives, this auto object has been passed into the event handler to use.
1 2 3 4 | <span class="token function">handleSubmit</span> <span class="token punctuation">(</span> <span class="token parameter">event</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token string">The button was clicked at </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> event <span class="token punctuation">.</span> timeStamp <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">.</span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Event Modifiers
I’ll give an example first: for example, when you do submit in the form, the method sending the form will often redirect before running the code in the event handling method
. To prevent this from happening, we would do the following in the event handling method
:
1 2 3 4 | <span class="token function">handleSubmit</span> <span class="token punctuation">(</span> <span class="token parameter">event</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> event <span class="token punctuation">.</span> <span class="token function">preventDefault</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Vue provides us with event modifier
with directives.
1 2 | <span class="token operator"><</span> form @submit <span class="token punctuation">.</span> prevent <span class="token operator">=</span> <span class="token string">"handleSubmit"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> form <span class="token operator">></span> |
Vue gives us a number of event modifier
that can be handled in a variety of situations
.stop
.prevent
.capture
.self
.once
.passive
Custom events
As we all know, Vue is designed in a component
orientation, so can we make a component emit its own event or not? The answer is absolutely world,.
For example, we want a child component to send data to a parent component. Here we can’t use props because it’s only passed from parent to child, if you deliberately change that data in the child component, there will be a avoid
error. So how can the child component tell the parent component to change that data?
To do this, we’ll call this.$emit("my-event")
from the child component when we want to trigger some event to change the parent’s data passed down to the child. For example, if we want to increment by one unit of counter then we would do the following: ParentComponent
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token operator"><</span> template <span class="token operator">></span> <span class="token operator"><</span> div <span class="token operator">></span> <span class="token operator"><</span> child <span class="token operator">-</span> component @increase <span class="token operator">=</span> <span class="token string">"handleEvent"</span> <span class="token operator">:</span> counter <span class="token operator">=</span> <span class="token string">"counter"</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> template <span class="token operator">></span> <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> <span class="token function">data</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> counter <span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> methods <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">handleEvent</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> counter <span class="token operator">+=</span> <span class="token number">1</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
ChildComponent
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token operator"><</span> template <span class="token operator">></span> <span class="token operator"><</span> div <span class="token operator">></span> <span class="token operator"><</span> p <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> counter <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token operator"><</span> button @click <span class="token operator">=</span> <span class="token string">"increase"</span> <span class="token operator">></span> Increase <span class="token operator"><</span> <span class="token operator">/</span> button <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> template <span class="token operator">></span> <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> props <span class="token operator">:</span> <span class="token punctuation">{</span> counter <span class="token operator">:</span> Number <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> methods <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">increase</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> <span class="token function">$emit</span> <span class="token punctuation">(</span> <span class="token string">"increase"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
Event bus
As you have seen above, child components can emit events onto parent components. But if we want that child component to emit on any component such as grandfather component, instrument component, for example, …
To do this, you can use the event bus
. This is where we create a Vue instance so we can call the event on whatever component that imports it. You just understand it is a means to help the component to perform emit on any component that imports.
First, you create a js file in any folder in your project with the following content eventBus.js
1 2 3 | <span class="token keyword">import</span> Vue <span class="token keyword">from</span> <span class="token string">"vue"</span> <span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">new</span> <span class="token class-name">Vue</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
The next step is to import this file into which component you want to emit event. You can use the $emit
method
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">import</span> eventBus <span class="token keyword">from</span> <span class="token string">"./eventBus"</span> <span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> <span class="token operator">...</span> methods <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">myMethod</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> eventBus <span class="token punctuation">.</span> <span class="token function">$emit</span> <span class="token punctuation">(</span> <span class="token string">"my-event"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Finally import this js file into the component that can listen to this event when the other child component emits it so that it can be captured. I suggest you use the created
lifecycle hook created
because you can access the Vue instance of the component here. And then you use the $on
method of the bus to listen for: the first parameter is the name of the event, the second parameter is its callback.
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">import</span> eventBus <span class="token keyword">from</span> <span class="token string">"./eventBus"</span> <span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token function">created</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> eventBus <span class="token punctuation">.</span> <span class="token function">$on</span> <span class="token punctuation">(</span> <span class="token string">"my-event"</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"my-event called on global event bus"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
This is exactly how components can share data. You can also refer to Vuex offline.
Conclude
So through some of my sharing above, I hope you also understand a part about events and how to handle events in Vue. Thank you for reading my article.