Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to trigger events using Vue.js?

I have just started using Vue.js and find myself continuously turning to jQuery to help in certain situations. Most recently I have attempted to, unsuccessfully "trigger" (or emulate) an event, such as an on click or blur event.

I know in jQuery you can do the following:

$('#my-selector').trigger('click'); 

But how can this be acheived using Vue.js? I am wanting to move away from using jQuery as much as possible.

Take the below as an example:

<div id="my-scope">     <button type="button" v-on="click: myClickEvent">Click Me!</button> </div>  <script> new Vue({     el: "#my-scope",     data: {         foo: "Hello World"     },     methods: {         myClickEvent: function(e) {             console.log(e.targetVM);             alert(this.foo);         },         anotherRandomFunciton: function() {             this.myClickEvent();         }     } }); </script> 

If I was to call anotherRandomFunciton, I would like it to emulate (or trigger) the above click event. However, I attempt this the event (or e in the above example) never gets passed to the function.

Does Vue.js have a method for achieving this?

like image 913
Nick Law Avatar asked Aug 10 '15 11:08

Nick Law


People also ask

Can JavaScript trigger events?

HTML events are handled by JavaScript. When an event occurs, it requires some action to be taken. This action can be accomplished through JavaScript event handlers. In addition to JavaScript, jQuery which is equivalent to JavaScript in terms of functionality can also be used to trigger events in a HTML document.

How do you trigger a watch in Vue?

To trigger the Vue watch method, you should assign a new city name to the value property of the ref object. Do not reset the city variable itself. We assign Dallas to city dot value. We can see the watch method has been triggered.

How do you emit an event in Vue 3?

Custom events using Composition API The setup function accepts two arguments: props and context . We can access the component emit method from context . We can create a function where we call the emit method and run the function when the button is clicked.


1 Answers

You need to get a reference to your button by using v-el like so:

<button type="button" @click="myClickEvent" v-el:my-btn>Click Me!</button> 

Then, in your method:

function anotherRandomFunction() {     var elem = this.$els.myBtn     elem.click() } 

It's just a native DOM click event. See v-el Documentation

Or since Vue 2.x:

<template>     <button type="button" @click="myClickEvent" ref="myBtn">         Click Me!     </button> </template>  <script> export default {     methods: {         myClickEvent($event) {             const elem = this.$refs.myBtn             elem.click()         }     } } </script> 

Since Vue uses and listens for native DOM events only. You can trigger native DOM events using the Element#dispatchEvent like so:

var elem = this.$els.myBtn; // Element to fire on  var prevented = elem.dispatchEvent(new Event("change")); // Fire event  if (prevented) {} // A handler used event.preventDefault(); 

This is not exactly ideal or best practice. Ideally, you should have a function that handles the internals and an event handler that calls that function. That way, you can call the internals whenever you need to.

like image 131
matpie Avatar answered Sep 28 '22 17:09

matpie