จะเรียกใช้หลายฟังก์ชันด้วย @click ใน vue ได้อย่างไร?


112

คำถาม:

จะเรียกใช้หลายฟังก์ชันใน @click เดียวได้อย่างไร? (aka v-on:click)?

ฉันเหนื่อย

  • แบ่งฟังก์ชันด้วยเครื่องหมายอัฒภาค: <div @click="fn1('foo');fn2('bar')"> </div>;

  • ใช้หลายตัว@click: <div @click="fn1('foo')" @click="fn2('bar')"> </div>;

แต่จะทำอย่างไรให้ถูกต้อง?

PS : แน่นอนว่าฉันทำได้เสมอ

<div v-on:click="fn3('foo', 'bar')"> </div>

function fn3 (args) { 
  fn1(args);
  fn2(args);
}

แต่บางครั้งมันก็ไม่ดี


10
สร้างตัวจัดการการคลิกเพียงครั้งเดียวและในการเรียกใช้สองฟังก์ชัน
Tushar

3
ใช่ฉันทำได้ แต่ฉันน่าเกลียดไปหน่อย
Sergei Panfilov

1
เพิ่มฟังก์ชันที่ผิดปกติเพื่อทำสิ่งนั้น: <div v-on: click = "return function () {fn1 ('foo'); fn2 ('bar');} ()"> </div>
Wolfgang

@Wolfgang เพิ่มสิ่งนี้เป็นคำตอบ (นี่เป็นทางเลือกสุดท้าย)
Sergei Panfilov

1
v-on:click="[click1($event), click2($event)]"นี่คือสิ่งที่อ่านได้มากขึ้นในความคิดของฉันคุณสามารถทำเช่นนี้: ฉันตอบไว้ด้านล่าง :)
Shailen Naidoo

คำตอบ:


267

ใน Vue 2.3 ขึ้นไปคุณสามารถทำได้:

<div v-on:click="firstFunction(); secondFunction();"></div>
// or
<div @click="firstFunction(); secondFunction();"></div>

2
เย็น. ฉันเดาว่านี่ต้องใหม่สำหรับ 2.3? ไม่ทำงานบน 2.2.6 สำหรับฉัน เหตุผลที่ดีในการอัปเกรดหากเป็นเช่นนั้น
RoccoB

พยายามนี้และไปกับคำตอบที่ชัดเพราะผมไม่สามารถคิดออกวิธีการส่งeventผ่าน
Pirijan

6
น่าสนใจที่จะต้องทราบว่าวงเล็บในชื่อฟังก์ชันจำเป็นในการทำงาน v-on:click="firstFunction; secondFunction;"จะไม่ทำงาน
Andre Ravazzi

5
@Pirijan มันผูกพันกับ$event
Michael Mrozek

1
@Pirijan <div @click="firstFunction($event); secondFunction($event);Et voilà :)
rdhainaut

47

ก่อนอื่นคุณสามารถใช้สัญกรณ์สั้น ๆ@clickแทนv-on:clickเพื่อจุดประสงค์ในการอ่านได้

ประการที่สองคุณสามารถใช้ตัวจัดการเหตุการณ์การคลิกที่เรียกใช้ฟังก์ชัน / วิธีการอื่น ๆ ตามที่ @Tushar กล่าวไว้ในความคิดเห็นของเขาด้านบนดังนั้นคุณจะได้สิ่งต่อไปนี้:

<div id="app">
   <div @click="handler('foo','bar')">
       Hi, click me!
   </div>
</div>

<!-- link to vue.js !--> 
<script src="vue.js"></script>

<script>
   (function(){
        var vm = new Vue({
            el:'#app',
            methods:{
                method1:function(arg){
                    console.log('method1: ',arg);
                },
                method2:function(arg){
                    console.log('method2: ',arg);
                },
                handler:function(arg1,arg2){
                    this.method1(arg1);
                    this.method2(arg2);
                }
            }
        })
    }()); 
</script>

20

หากคุณต้องการบางสิ่งที่อ่านง่ายขึ้นคุณสามารถลองสิ่งนี้:

<button @click="[click1($event), click2($event)]">
  Multiple
</button>

สำหรับฉันการแก้ปัญหานี้ให้ความรู้สึกเหมือน Vue เหมือนหวังว่าคุณจะชอบ


ดูเหมือนจะเป็นวิธีแก้ปัญหาที่เป็นสำนวนที่สุด มีข้อบกพร่องหรือไม่?
Kiraa

1
@Kiraa Nope ไม่ใช่ว่าฉันพบตั้งแต่ฉันคิดไวยากรณ์นั้นแล้ว ถ้าฉันเจออะไรฉันจะเพิ่มความคิดเห็น :)
Shailen Naidoo

1
วิธีถ้าคุณต้องการe.stopPropagate()บนclick1($event)เพื่อให้click2(event)เคยชินจะจัดการ?
Julio Motol

2
@JulioMotol click1($event)และclick2($event)เป็นเพียง 2 ฟังก์ชันที่แตกต่างกันสำหรับเหตุการณ์เดียวกันไม่ใช่ 2 เหตุการณ์ที่แตกต่างกัน จะไม่ทำอะไรให้e.stopPropagate() click2()หวังว่าคงสมเหตุสมผล :)
Shailen Naidoo

1
จึงไม่มีทางหยุดยั้งการclick2($event)กระตุ้นได้?
Julio Motol

14

หากต้องการเพิ่มฟังก์ชันที่ผิดปกติให้ทำซึ่งอาจเป็นทางเลือก:

<div v-on:click="return function() { fn1('foo');fn2('bar'); }()"> </div> 

12
ทางเลือก ES6: @click = "() => {function1 (parameters); function2 (parameters);}"
AdamJB

หมายเหตุสำคัญ: หากฟังก์ชันที่ซ้อนกันของคุณต้องการ$eventเป็นอาร์กิวเมนต์คุณจะต้องส่งต่อเป็นพารามิเตอร์ไปยังฟังก์ชันใหม่เพื่อใช้ภายในฟังก์ชันนั้น เช่น. ($event) => {func1($event); func2('x');}
zcoop98

9

แยกเป็นชิ้น ๆ .

อินไลน์:

<div @click="f1() + f2()"></div> 

หรือ: ผ่านฟังก์ชันคอมโพสิต:

<div @click="f3()"></div> 

<script>
var app = new Vue({
  // ...
  methods: {
    f3: function() { f1() + f2(); }
    f1: function() {},
    f2: function() {}
  }
})
</script>

9

วิธีง่ายๆในการทำ v-on: click = "firstFunction (); secondFunction ();"


2
ฉันเชื่อว่าสิ่งนี้จะทำลายคอมไพเลอร์และไม่แสดงผล เพิ่งลอง - ยากจน
Chris Johnson

ฉันเห็นด้านล่างมันใช้ได้สำหรับบางคน แต่แบ่งเป็น 2.6.6 สำหรับฉัน
Chris Johnson

7

สิ่งนี้ใช้ได้ผลสำหรับฉันเมื่อคุณต้องการเปิดกล่องโต้ตอบอื่นโดยคลิกปุ่มในกล่องโต้ตอบและปิดกล่องนี้ด้วย ส่งผ่านค่าเป็นพารามิเตอร์ด้วยตัวคั่นด้วยเครื่องหมายจุลภาค

<v-btn absolute fab small slot="activator" top right color="primary" @click="(addTime = true),(ticketExpenseList = false)"><v-icon>add</v-icon></v-btn>


4

การVueจัดการเหตุการณ์อนุญาตให้เรียกใช้ฟังก์ชันเดียวเท่านั้น หากคุณต้องการทำหลายรายการคุณสามารถทำ Wrapper ที่มีทั้ง:

<div @click="handler"></div>
////////////////////////////
handler: function() { //Syntax assuming its in the 'methods' option of Vue instance
    fn1('foo');
    fn2('bar');
}

แก้ไข

อีกทางเลือกหนึ่งคือแก้ไขตัวจัดการแรกให้มีการโทรกลับและส่งผ่านตัวที่สองใน

<div @click="fn1('foo', fn2)"></div>
////////////////////////////////////
fn1: function(value, callback) {
    console.log(value);
    callback('bar');
},
fn2: function(value) {
    console.log(value);
}

2

Html:

<div id="example">
  <button v-on:click="multiple">Multiple</button>
</div>

JS:

var vm = new Vue({
  el: '#example',
  data: {
    name: 'Vue.js'
  },
  // define methods under the `methods` object
  methods: {
    multiple: function (event) {
      this.first()
      this.second()
    }
    first:  function (event) {
      //yourstuff
    }
    second: function (event) {
      //yourstuff
    }
  }
})

vm.multiple()

1

ฉันจะเพิ่มว่าคุณยังสามารถใช้สิ่งนี้เพื่อเรียกการเปล่งเสียงหรือวิธีการหลายรายการหรือทั้งสองอย่างร่วมกันโดยแยกด้วย; อัฒภาค

  @click="method1(); $emit('emit1'); $emit('emit2');"


-2

อย่างไรก็ตามคุณสามารถทำสิ่งนี้ได้:

<div onclick="return function()
              {console.log('yaay, another onclick event!')}()" 
              @click="defaultFunction"></div>

ใช่โดยใช้เหตุการณ์ html onclick ดั้งเดิม

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