การส่งเหตุการณ์และอาร์กิวเมนต์ไปที่ v-on ใน Vue.js


158

ฉันผ่านพารามิเตอร์ในv-on:inputคำสั่ง ถ้าฉันไม่ผ่านมันฉันสามารถเข้าถึงเหตุการณ์ในวิธีการ มีวิธีใดบ้างที่ฉันยังสามารถเข้าถึงเหตุการณ์เมื่อส่งพารามิเตอร์ไปยังฟังก์ชัน ไม่ใช่ว่าฉันใช้ vue-router:

นี่คือโดยไม่ต้องผ่านพารามิเตอร์ ฉันสามารถเข้าถึงวัตถุเหตุการณ์

HTML

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

จาวาสคริ

  methods: {
    addToCart: function (event) {

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

นี่คือเมื่อผ่านพารามิเตอร์ ฉันไม่สามารถเข้าถึงวัตถุเหตุการณ์

HTML

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

จาวาสคริ

  methods: {
    addToCart: function (id) {

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

นี่เป็นข้อมูลโค้ดบางส่วนควรดีพอที่จะทำซ้ำปัญหาที่ฉันมี

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

คำตอบ:


241

หากคุณต้องการเข้าถึงวัตถุเหตุการณ์เช่นเดียวกับข้อมูลที่ส่งผ่านคุณต้องผ่านeventและticket.idทั้งสองเป็นพารามิเตอร์ดังต่อไปนี้:

HTML

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

จาวาสคริ

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

ดูซอการทำงาน: https://jsfiddle.net/nee5nszL/

แก้ไข: เคสด้วย vue-router

ในกรณีที่คุณใช้ vue-router คุณอาจต้องใช้$ event ในv-on:inputวิธีการของคุณดังนี้:

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

นี่คือการทำงานซอ


10
ฉันพยายาม แต่ฉันได้รับข้อความแสดงข้อผิดพลาด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 คุณผ่านการจัดกิจกรรมจาก HTML นี้v-on:input?
Saurabh

ไม่แน่ใจว่าสิ่งนี้เกี่ยวข้องหรือไม่ แต่ฉันใช้ vue-router และสิ่งนี้เกิดขึ้นในหนึ่งใน partials
ตุ๊กแก

7
@Saurabh @geckob เพื่อหลีกเลี่ยงข้อผิดพลาดคุณต้องส่ง$eventตัวแปรพิเศษไปยังการเรียกเมธอดv-on:input="addToCart($event, num)"
williamukoh

2
คุณควรผ่าน$eventไม่ใช่event
Michael Tranchida

20

คุณสามารถทำอะไรเช่นนี้ ...

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

Evan คุณแนะนำเทคนิคนี้ในกระทู้เดียวบนฟอรัม Vue โดยทั่วไปเหตุการณ์บางอย่างอาจส่งเสียงมากกว่าหนึ่งอาร์กิวเมนต์ นอกจากนี้เอกสารอธิบายสถานะตัวแปรภายใน $ event มีไว้เพื่อส่งเหตุการณ์ DOM ดั้งเดิม


jsfiddle.net/50wL7mdz/30115 หมายเหตุไวยากรณ์การแพร่กระจายจะถูก transpiled เมื่อใช้ส่วนประกอบ * .vue แต่ไม่ใช่หากคุณใช้การรวบรวมในเบราว์เซอร์
ИльяЗеленько

2
มีความแตกต่างระหว่าง "... อาร์กิวเมนต์" และ "$ event" หรือไม่
กราฟิลส์

@ ราฟาเอลมีความแตกต่าง! ด้วยอาร์กิวเมนต์ "$ event" คุณจะผ่านการโต้แย้งเพียงครั้งเดียวจากเหตุการณ์
Piotr Dawidiuk

6

ขึ้นอยู่กับอาร์กิวเมนต์ที่คุณต้องผ่านโดยเฉพาะอย่างยิ่งสำหรับตัวจัดการเหตุการณ์ที่กำหนดเองคุณสามารถทำสิ่งนี้:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.