Passer un événement et un argument à v-on dans Vue.js

159

Je passe un paramètre dans les v-on:inputdirectives. Si je ne le passe pas, je peux accéder à l'événement dans la méthode. Est-il possible que je puisse toujours accéder à l'événement en passant le paramètre à la fonction. Non pas que j'utilise vue-router:

C'est sans passer le paramètre. Je peux accéder à l'objet événement

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

C'est lors du passage du paramètre. Je ne peux pas accéder à l'objet événement

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

Voici un extrait de code, qui devrait être assez bon pour reproduire le problème que je rencontre

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

geckob
la source

Réponses:

242

Si vous souhaitez accéder objet événement ainsi que les données transmises, vous devez passer eventet à la ticket.idfois en tant que paramètres, comme suit:

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

Voir violon de travail: https://jsfiddle.net/nee5nszL/

Edité: cas avec vue-router

Si vous utilisez vue-router, vous devrez peut-être utiliser $ event dans votre v-on:inputméthode comme suit:

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

Voici le violon de travail .

Saurabh
la source
10
J'ai essayé mais je reçois le message d'erreurProperty 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 vous avez passé l'événement de HTML: v-on:input?
Saurabh
Je ne suis pas sûr que cela soit lié ou non, mais j'utilise vue-router et cela se produit dans l'un des partiels
geckob
7
@Saurabh @geckob Afin d'éviter l'erreur, vous devez passer la $eventvariable spéciale à l'appel de méthodev-on:input="addToCart($event, num)"
williamukoh
2
Vous devriez passer $event, nonevent
Michael Tranchida
20

Vous pouvez également faire quelque chose comme ça ...

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

Evan You lui-même a recommandé cette technique dans un message sur le forum Vue. En général, certains événements peuvent émettre plus d'un argument. De même, comme l' indique la documentation, la variable interne $ event est destinée à transmettre l'événement DOM d'origine.

xpuu
la source
jsfiddle.net/50wL7mdz/30115 Notez que la syntaxe de diffusion sera transpilée lors de l'utilisation des composants * .vue, mais pas si vous utilisez la compilation dans le navigateur.
Илья Зеленько
2
il y a une différence entre "... arguments" et "$ event"?
Raphael
@Raphael Il y a une différence! Avec l'argument "$ event", vous ne passez qu'un seul argument de l'événement.
Piotr Dawidiuk le
6

En fonction des arguments à transmettre, en particulier pour les gestionnaires d'événements personnalisés, vous pouvez faire quelque chose comme ceci:

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

jasonlfunk
la source