@Click in vue ile birden fazla işlevi nasıl çağırabilirim?


112

Soru:

Tek bir @click ile birden fazla işlevi nasıl çağırabilirim? (aka v-on:click)?

denedim

  • Noktalı virgül ile bölünmüş fonksiyonlar <div @click="fn1('foo');fn2('bar')"> </div>:;

  • Birkaç kullanın @click: <div @click="fn1('foo')" @click="fn2('bar')"> </div>;

ama nasıl düzgün yapılır?

Not : Elbette her zaman yapabilirim

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

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

Ama bazen bu hiç hoş değil.


10
Tek tıklama işleyicisi ve bu çağrıda iki işlev oluşturun.
Tushar

3
Evet, bunu yapabilirim, ama ben biraz çirkinim.
Sergei Panfilov

1
bunu yapmak için bir anomimous işlev ekleyin: <div v-on: click = "return function () {fn1 ('foo'); fn2 ('bar');} ()"> </div>
Wolfgang

@Wolfgang Bunu bir yanıt olarak ekleyin (bu sonunda alternatif bir çözümdür).
Sergei Panfilov

1
İşte bir şey daha okunabilir Bence, sen bunu yapabilirsiniz: v-on:click="[click1($event), click2($event)]". Aşağıda cevapladım :)
Shailen Naidoo

Yanıtlar:


267

Vue 2.3 ve üzeri sürümlerde bunu yapabilirsiniz:

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

2
Güzel. Sanırım bu 2.3 için yeni olmalı? Benim için 2.2.6'da çalışmıyor. Öyleyse yükseltmek için iyi bir neden.
RoccoB

Bu çalıştı ve geçmek nasıl çözemedim çünkü sade cevapları ile gitti eventaracılığıyla
Pirijan

6
İşlev adındaki parantezin çalışması için gerekli olduğuna dikkat etmek ilginçtir. v-on:click="firstFunction; secondFunction;"çalışmayacak
Andre Ravazzi

5
@Pirijan Bağlı$event
Michael

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

47

Öncelikle, okunabilirlik amaçları @clickyerine kısa gösterimi kullanabilirsiniz v-on:click.

İkinci @Tushar'ın yukarıdaki yorumunda belirtildiği gibi diğer işlevleri / yöntemleri çağıran bir tıklama olay işleyicisi kullanabilirsiniz, böylece şöyle bir şey elde edersiniz:

<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

Biraz daha okunaklı bir şey istiyorsanız, şunu deneyebilirsiniz:

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

Bana göre, bu çözüm zevk alacağın daha Vue benzeri bir umut veriyor


Bu, en deyimsel çözüm gibi görünüyor. Herhangi bir sakınca var mı?
Kiraa

1
@Kiraa Hayır, bu sözdizimini anladığımdan beri bulduğumdan değil. Bir şeyle karşılaşırsam, bir yorum ekleyeceğim :)
Shailen Naidoo

1
İstersen nasıl e.stopPropagate()üzerine click1($event)böylece click2(event)ele alışkanlık?
Julio Motol

2
@JulioMotol click1($event)ve click2($event)aynı olay için 2 farklı olay için sadece 2 farklı işlevdir. e.stopPropagate()için hiçbir şey yapmayacak click2(). Umarım mantıklı :)
Shailen Naidoo

1
Yani click2($event)tetiklemeyi durdurmanın bir yolu yok mu?
Julio Motol

14

yapmak için anormal bir işlev eklemek alternatif olabilir:

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

12
Bir ES6 alternatifi: @click = "() => {function1 (parametreler); function2 (parametreler);}"
AdamJB

Önemli not: İç içe geçmiş işlevlerinizden $eventbirinin bağımsız değişken olması gerekiyorsa, onu içinde kullanılacak yeni işlevinize bir parametre olarak iletmeniz gerekir. Örneğin. ($event) => {func1($event); func2('x');}
zcoop98

9

Parçalara ayırın.

Çizgide:

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

VEYA: Bileşik bir işlev aracılığıyla:

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

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

9

V-on yapmanın bu basit yolu: click = "firstFunction (); secondFunction ();"


2
Bunun derleyiciyi bozacağına ve render yapmayacağına inanıyorum. Sadece denedim - kırdı.
Chris Johnson

Aşağıda bazıları için işe yaradığını görebiliyorum, ancak benim için 2.6.6'da kırılıyor.
Chris Johnson

7

Bu, bir iletişim kutusunun içindeki bir düğmeye tıklayarak başka bir iletişim kutusu açmanız gerektiğinde ve bunu da kapatmanız gerektiğinde benim için işe yarar. Değerleri virgül ayırıcıyla params olarak geçirin.

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

5

Vue 2.5.1'de düğme çalışmaları için

 <button @click="firstFunction(); secondFunction();">Ok</button>

4

VueOlay işleme yalnızca tek fonksiyon çağrıları için izin verir. Birden fazla işlem yapmanız gerekiyorsa, her ikisini de içeren bir sarmalayıcı yapabilirsiniz:

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

DÜZENLE

Diğer bir seçenek de, ilk işleyiciyi bir geri arama için düzenlemek ve ikinciyi içeri aktarmaktır.

<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

Bunu birden çok yayımı veya yöntemi veya her ikisini birden ayırarak birlikte çağırmak için de kullanabileceğinizi eklemek isterim; noktalı virgül

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

0

Bunu kullanabilirsiniz:

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

-2

ancak bunun gibi bir şey yapabilirsiniz:

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

evet, yerel onclick html olayını kullanarak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.