Melewati acara dan argumen ke v-on di Vue.js

158

Saya melewatkan parameter dalam v-on:inputarahan. Jika saya tidak lulus, saya bisa mengakses acara dalam metode ini. Apakah ada cara saya masih bisa mengakses acara ketika melewati parameter ke fungsi. Bukan berarti saya menggunakan vue-router:

Ini tanpa melewati parameter. Saya dapat mengakses objek acara

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

Ini ketika melewati parameter. Saya tidak dapat mengakses objek acara

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

Berikut ini beberapa cuplikan kode, harus cukup baik untuk mereplikasi masalah yang saya alami

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

tokek
sumber

Jawaban:

241

Jika Anda ingin mengakses objek acara serta data yang dikirimkan, Anda harus meneruskan eventdan ticket.idkeduanya sebagai parameter, seperti berikut:

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

Lihat biola yang berfungsi: https://jsfiddle.net/nee5nszL/

Diedit: case dengan vue-router

Jika Anda menggunakan vue-router, Anda mungkin harus menggunakan $ event dalam v-on:inputmetode Anda seperti berikut:

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

Ini biola yang berfungsi .

Saurabh
sumber
10
Saya mencoba tetapi saya mendapatkan pesan kesalahanProperty 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 Anda melewati acara dari HTML: v-on:input?
Saurabh
Tidak yakin ini terkait atau tidak, tapi saya menggunakan vue-router dan ini terjadi di salah satu parsial
geckob
7
@Saurabh @geckob Untuk menghindari kesalahan, Anda harus meneruskan $eventvariabel khusus ke pemanggilan metodev-on:input="addToCart($event, num)"
williamukoh
2
Anda harus lulus $event, bukanevent
Michael Tranchida
20

Anda juga dapat melakukan sesuatu seperti ini ...

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

Evan You sendiri merekomendasikan teknik ini dalam satu posting di forum Vue. Secara umum beberapa peristiwa dapat memancarkan lebih dari satu argumen. Juga sebagai dokumentasi menyatakan variabel internal $ event dimaksudkan untuk melewati acara DOM asli.

xpuu
sumber
jsfiddle.net/50wL7mdz/30115 Perhatikan sintaks penyebaran akan ditranspilasikan saat menggunakan komponen * .vue, tetapi tidak jika Anda menggunakan kompilasi dalam browser.
Илья Зеленько
2
ada perbedaan antara "... argumen" dan "$ event"?
Raphael
@ Raphael Ada perbedaan! Dengan argumen "$ event" Anda hanya melewati satu argumen dari acara tersebut.
Piotr Dawidiuk
6

Bergantung pada argumen apa yang perlu Anda sampaikan, terutama untuk penangan peristiwa khusus, Anda dapat melakukan sesuatu seperti ini:

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

jasonlfunk
sumber