ChatGPT解决这个技术问题 Extra ChatGPT

Passing event and argument to v-on in Vue.js

I pass a parameter in v-on:input directives. If I don't pass it, I can access the event in the method. Is there any way I can still access the event when passing the parameter to the function? Note that I am using vue-router.

This is without passing the parameter. I can access the event object:

HTML

<input type="number" v-on:input="addToCart" min="0" placeholder="0">

Javascript

methods: {
  addToCart: function (event) {
    // I need to access the element by using event.target
    console.log('In addToCart')
    console.log(event.target)
  }
}

This is when passing the parameter. I can't access the event object:

HTML

<input type="number" v-on:input="addToCart(ticket.id)" min="0" placeholder="0">

Javascript

methods: {
  addToCart: function (id) {
    // How can I access the element by using event
    console.log('In addToCart')
    console.log(id)
  }
}

Here is a fiddle of the code, it should be good enough to replicate the problem that I am having:

https://jsfiddle.net/lookman/vdhwkrmq/


t
tony19

If you want to access event object as well as data passed, you have to pass event and ticket.id both as parameters, like following:

HTML

<input type="number" v-on:input="addToCart($event, ticket.id)" min="0" placeholder="0">

Javascript

methods: {
  addToCart: function (event, id) {
    // use event here as well as id
    console.log('In addToCart')
    console.log(id)
  }
}

See working fiddle: https://jsfiddle.net/nee5nszL/

Edited: case with vue-router

In case you are using vue-router, you may have to use $event in your v-on:input method like following:

<input type="number" v-on:input="addToCart($event, num)" min="0" placeholder="0">

Here is working fiddle.


I tried but I get the error message Property or method "event" is not defined on the instance but referenced during render. Make sure to declare reactive data properties in the data option
@geckob you passed the event from HTML: v-on:input ?
Not sure this is related or not, but I am using vue-router and this happens in one of the partials
@Saurabh @geckob In order to avoid the error, you need to pass the special $event variable to the method call v-on:input="addToCart($event, num)"
You should pass $event, not event
t
tony19

You can also do something like this...

<input @input="myHandler('foo', 'bar', ...arguments)">

Evan You himself recommended this technique in one post on Vue forum. In general some events may emit more than one argument. Also as documentation states internal variable $event is meant for passing original DOM event.


jsfiddle.net/50wL7mdz/30115 Note the spread syntax will be transpiled when using *.vue components, but not if you use in-browser compilation.
there is a difference between "...arguments" and "$event"?
@Raphael There is a difference! With "$event" argument you pass only one argument from the event.
this was the solution for me! Thanks
This solution works, unlike the other one. It does allow to pass multiple arguments as Raphael mentioned.
j
jasonlfunk

Depending on what arguments you need to pass, especially for custom event handlers, you can do something like this:

<div @customEvent='(arg1) => myCallback(arg1, arg2)'>Hello!</div>


M
MD SHAYON

I like this way of passing parameters because we can pass events and parameters both using an anonymous callback function.

<button v-on:click="(e)=>deleteHandler(e, args1)" > Click me </button>

You can also use the special $event variable for a shorter expression: @click="deleteHandler($event, args1)".

关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now