Pasar evento y argumento a v-on en Vue.js


158

Paso un parámetro en las v-on:inputdirectivas. Si no lo paso, puedo acceder al evento en el método. ¿Hay alguna manera de que todavía pueda acceder al evento al pasar el parámetro a la función? No es que esté usando vue-router:

Esto es sin pasar el parámetro. Puedo acceder al objeto del evento

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)
    }
  }

Esto es al pasar el parámetro. No puedo acceder al objeto de evento

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)
    }
  }

Aquí hay un fragmento del código, debería ser lo suficientemente bueno como para replicar el problema que estoy teniendo

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

Respuestas:


241

Si desea acceder al objeto de evento, así como a los datos pasados, debe pasar eventy ticket.idambos como parámetros, como los siguientes:

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)
  }
}

Ver violín de trabajo: https://jsfiddle.net/nee5nszL/

Editado: caso con vue-router

En caso de que esté usando vue-router, es posible que tenga que usar $ event en su v-on:inputmétodo como el siguiente:

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

Aquí está trabajando el violín .


10
Lo intenté, pero me sale el mensaje de errorProperty 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

@geckob pasaste el evento desde HTML v-on:input:?
— Saurabh

No estoy seguro de si esto está relacionado o no, pero estoy usando vue-router y esto sucede en uno de los parciales
— geckob

77
@Saurabh @geckob Para evitar el error, debe pasar la $eventvariable especial a la llamada al métodov-on:input="addToCart($event, num)"
— williamukoh

2
Deberías pasar $event, noevent
— Michael Tranchida

20

También puedes hacer algo como esto ...

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

Evan You mismo recomendó esta técnica en una publicación en el foro Vue. En general, algunos eventos pueden emitir más de un argumento. Además, como la documentación indica que la variable interna $ event está destinada a pasar el evento DOM original.


jsfiddle.net/50wL7mdz/30115 Tenga en cuenta que la sintaxis extendida se transpilará al usar componentes * .vue, pero no si usa la compilación en el navegador.
— Илья Зеленько

2
Hay una diferencia entre "... argumentos" y "$ event"?
— Raphael

@Raphael ¡Hay una diferencia! Con el argumento "$ event", solo pasa un argumento del evento.
— Piotr Dawidiuk

6

Dependiendo de los argumentos que necesite pasar, especialmente para los controladores de eventos personalizados, puede hacer algo como esto:

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.