Come chiamare più funzioni con @click in vue?


102

Domanda:

Come chiamare più funzioni in un singolo clic @? (aka v-on:click)?

Provai

  • Funzioni di Spalato con un punto e virgola: <div @click="fn1('foo');fn2('bar')"> </div>;

  • Utilizzare diversi @click: <div @click="fn1('foo')" @click="fn2('bar')"> </div>;

ma come farlo correttamente?

PS : Di sicuro posso sempre farlo

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

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

Ma a volte questo non è carino.


10
Crea un gestore di clic singolo e in quella chiama due funzioni.
Tushar

3
Sì, posso farlo, ma sono un po 'brutto.
Sergei Panfilov

1
aggiungi una funzione anomala per farlo: <div v-on: click = "return function () {fn1 ('foo'); fn2 ('bar');} ()"> </div>
Wolfgang

@ Wolfgang Aggiungilo come risposta (questa è finalmente una soluzione alternativa).
Sergei Panfilov

1
Qui è qualcosa di più leggibile, a mio parere, si può fare questo: v-on:click="[click1($event), click2($event)]". Ho risposto di seguito :)
Shailen Naidoo

Risposte:


242

Su Vue 2.3 e versioni successive puoi farlo:

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

2
Freddo. Immagino che questo debba essere nuovo per 2.3? Non funziona su 2.2.6 per me. Un buon motivo per aggiornare se è così.
RoccoB

provato questo, e se ne andò con le risposte più semplici perché non riuscivo a capire come passare eventattraverso
Pirijan

4
interessante notare che la parentesi nel nome della funzione è necessaria per funzionare. v-on:click="firstFunction; secondFunction;"non funzionerà
Andre Ravazzi

4
@Pirijan È destinato a$event
Michael Mrozek,

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

43

Prima di tutto puoi usare la notazione breve @click invece che v-on:clickper scopi di leggibilità.

Secondo Puoi usare un gestore di eventi click che chiama altre funzioni / metodi come menzionato da @Tushar nel suo commento sopra, quindi finisci con qualcosa del genere:

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

15

Se vuoi qualcosa di un po 'più leggibile, puoi provare questo:

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

Per me, questa soluzione sembra più una speranza di Vue che ti piaccia


Questa sembra la soluzione più idiomatica. Ci sono inconvenienti?
Kiraa

1
@Kiraa No, non che ho trovato da quando ho capito quella sintassi. Se mi
imbatto

1
Come se lo volessi e.stopPropagate()in click1($event)modo che click2(event)non venga gestito?
Julio Motol

2
@ JulioMotol click1($event)e click2($event)sono solo 2 diverse funzioni per lo stesso evento non 2 eventi diversi. e.stopPropagate()non farà nulla per click2(). Spero che abbia senso :)
Shailen Naidoo

Quindi non c'è modo di fermare l' click2($event)attivazione?
Julio Motol

11

per aggiungere una funzione anomala per farlo potrebbe essere un'alternativa:

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

10
Un'alternativa a ES6: @click = "() => {function1 (parameters); function2 (parameters);}"
AdamJB

Nota importante: se una delle tue funzioni annidate ha bisogno $eventdi un argomento, dovrai passarla come parametro alla tua nuova funzione da usare al suo interno. Per esempio. ($event) => {func1($event); func2('x');}
zcoop98

9

Dividi in pezzi.

In linea:

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

O: attraverso una funzione composita:

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

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

9

Questo semplice modo per eseguire v-on: click = "firstFunction (); secondFunction ();"


2
Credo che questo interromperà il compilatore e non il rendering. L'ho appena provato - si è rotto.
Chris Johnson

Di seguito posso vedere che funziona per alcuni, ma per me si interrompe nella 2.6.6.
Chris Johnson

7

Questo funziona per me quando è necessario aprire un'altra finestra di dialogo facendo clic su un pulsante all'interno di una finestra di dialogo e chiudere anche questa. Passa i valori come parametri con un separatore di virgola.

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

5

in Vue 2.5.1 per i pulsanti

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

4

La Vuegestione degli eventi consente solo chiamate a funzione singola. Se devi eseguirne più di uno, puoi eseguire un wrapper che includa entrambi:

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

MODIFICARE

Un'altra opzione è modificare il primo gestore per avere una richiamata e passare il secondo.

<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

Aggiungo che puoi anche usarlo per chiamare più emits o metodi o entrambi insieme separando con; punto e virgola

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

-2

puoi, tuttavia, fare qualcosa del genere:

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

sì, utilizzando l'evento html onclick nativo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.