Passando evento e argumento para v-on no Vue.js

158

Eu passo um parâmetro nas v-on:inputdiretivas. Se eu não passar, posso acessar o evento no método Ainda existe alguma maneira de acessar o evento ao passar o parâmetro para a função. Não que eu esteja usando o vue-router:

Isso sem passar o parâmetro. Eu posso acessar o objeto de 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)
    }
  }

É quando passa o parâmetro. Não consigo acessar o 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)
    }
  }

Aqui está um trecho do código, que deve ser bom o suficiente para replicar o problema que estou tendo

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

geckob
fonte

Respostas:

241

Se você deseja acessar o objeto de evento, bem como os dados transmitidos, precisará passar evente ticket.idambos como parâmetros, como a seguir:

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

Veja violino de trabalho: https://jsfiddle.net/nee5nszL/

Editado: caso com vue-router

Caso você esteja usando o vue-router, talvez seja necessário usar $ event no seu v-on:inputmétodo, como a seguir:

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

Aqui está trabalhando violino .

Saurabh
fonte
10
Eu tentei, mas recebo a mensagem de erroProperty 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 5/16/16
@geckob você passou o evento em HTML v-on:input:?
Saurabh
Não tenho certeza se isso está relacionado ou não, mas estou usando o vue-router e isso acontece em uma das parciais
geckob
7
@Saurabh @geckob Para evitar o erro, você precisa para passar o especial $eventvariável para a chamada de métodov-on:input="addToCart($event, num)"
williamukoh
2
Você deve passar $event, não #event
Michael Tranchida 11/11
20

Você também pode fazer algo assim ...

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

Evan Você mesmo recomendou esta técnica em um post no fórum Vue. Em geral, alguns eventos podem emitir mais de um argumento. Além disso, como a documentação declara que a variável interna $ event é para passar o evento DOM original.

xpuu
fonte
jsfiddle.net/50wL7mdz/30115 Observe que a sintaxe da propagação será transpilada ao usar componentes * .vue, mas não se você usar a compilação no navegador.
Илья Зеленько
2
existe uma diferença entre "... argumentos" e "$ event"?
Raphael
@Raphael Há uma diferença! Com o argumento "$ event", você passa apenas um argumento do evento.
Piotr Dawidiuk 19/09/19
6

Dependendo dos argumentos que você precisa passar, especialmente para manipuladores de eventos personalizados, é possível fazer algo assim:

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

jasonlfunk
fonte