Comment appeler plusieurs fonctions avec @click en vue?

103

Question:

Comment appeler plusieurs fonctions en un seul @click? (aka v-on:click)?

j'ai essayé

  • Fonctions séparées par un point virgule: <div @click="fn1('foo');fn2('bar')"> </div>;

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

mais comment le faire correctement?

PS : c'est sûr que je peux toujours faire

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

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

Mais parfois ce n'est pas sympa.

Sergueï Panfilov
la source
10
Créez un gestionnaire de clic et appelez deux fonctions.
Tushar
3
Oui, je peux le faire, mais je suis un peu moche.
Sergei Panfilov
1
ajoutez une fonction anonyme pour faire cela: <div v-on: click = "return function () {fn1 ('foo'); fn2 ('bar');} ()"> </div>
Wolfgang
@Wolfgang Ajoutez ceci comme réponse (c'est enfin une solution alternative).
Sergei Panfilov
1
Voici quelque chose de plus lisible à mon avis, vous pouvez le faire: v-on:click="[click1($event), click2($event)]". J'ai répondu ci-dessous :)
Shailen Naidoo

Réponses:

245

Sur Vue 2.3 et au-dessus, vous pouvez faire ceci:

<div v-on:click="firstFunction(); secondFunction();"></div>
// or
<div @click="firstFunction(); secondFunction();"></div>
Stuart Cusack
la source
2
Cool. Je suppose que cela doit être nouveau pour la version 2.3? Ne fonctionne pas sur 2.2.6 pour moi. Bonne raison de mettre à niveau si oui.
RoccoB
essayé, et est allé avec les réponses parce que je ne plus simples pouvais comprendre comment passer à eventtravers
Pirijan
5
intéressant de noter que la parenthèse dans le nom de la fonction est nécessaire pour fonctionner. v-on:click="firstFunction; secondFunction;"ne fonctionnera pas
Andre Ravazzi
4
@Pirijan C'est lié à$event
Michael Mrozek
1
@Pirijan <div @click="firstFunction($event); secondFunction($event);Et voilà :)
rdhainaut
44

Tout d'abord, vous pouvez utiliser la notation courte @clickau lieu de v-on:clickpour des raisons de lisibilité.

Deuxièmement, vous pouvez utiliser un gestionnaire d'événements click qui appelle d'autres fonctions / méthodes comme @Tushar mentionné dans son commentaire ci-dessus, vous vous retrouvez donc avec quelque chose comme ceci:

<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>
ismnoiet
la source
15

Si vous voulez quelque chose d'un peu plus lisible, vous pouvez essayer ceci:

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

Pour moi, cette solution ressemble plus à Vue, j'espère que vous apprécierez

Shailen Naidoo
la source
Cela semble être la solution la plus idiomatique. Y a-t-il des inconvénients?
Kiraa
1
@Kiraa Non, pas ce que j'ai trouvé depuis que j'ai compris cette syntaxe. Si je rencontre quelque chose, j'ajouterai un commentaire :)
Shailen Naidoo
1
Comment si vous voulez e.stopPropagate()sur la click1($event)sorte que click2(event)ne vais pas être manipulé?
Julio Motol
2
@JulioMotol click1($event)et ne click2($event)sont que 2 fonctions différentes pour le même événement et non 2 événements différents. e.stopPropagate()ne fera rien pour click2(). J'espère que cela a du sens :)
Shailen Naidoo
Il n'y a donc aucun moyen d'arrêter click2($event)de déclencher?
Julio Motol
12

ajouter une fonction anonyme à faire peut être une alternative:

<div v-on:click="return function() { fn1('foo');fn2('bar'); }()"> </div> 
Wolfgang
la source
10
Une alternative à ES6: @click = "() => {function1 (parameters); function2 (parameters);}"
AdamJB
Remarque importante: si l'une de vos fonctions imbriquées nécessite $eventun argument, vous devrez la passer en tant que paramètre à votre nouvelle fonction pour être utilisée à l'intérieur. Par exemple. ($event) => {func1($event); func2('x');}
zcoop98
9

Séparez en morceaux.

En ligne:

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

OU: Par une fonction composite:

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

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

Cette façon simple de faire v-on: click = "firstFunction (); secondFunction ();"

Monsieur Personne
la source
2
Je crois que cela cassera le compilateur et ne rendra pas. Juste essayé - cassé.
Chris Johnson
Je peux voir ci-dessous que cela fonctionne pour certains, mais casse en 2.6.6 pour moi.
Chris Johnson
7

Cela fonctionne pour moi lorsque vous devez ouvrir une autre boîte de dialogue en cliquant sur un bouton dans une boîte de dialogue et fermer celle-ci. Passez les valeurs sous forme de paramètres avec un séparateur par virgule.

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

dans Vue 2.5.1 pour les boutons

 <button @click="firstFunction(); secondFunction();">Ok</button>
Zhurov Konstantin
la source
4

La Vuegestion des événements ne permet que des appels de fonction uniques. Si vous devez en faire plusieurs, vous pouvez soit créer un wrapper qui inclut les deux:

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

ÉDITER

Une autre option consiste à modifier le premier gestionnaire pour avoir un rappel et à transmettre le second.

<div @click="fn1('foo', fn2)"></div>
////////////////////////////////////
fn1: function(value, callback) {
    console.log(value);
    callback('bar');
},
fn2: function(value) {
    console.log(value);
}
m_callens
la source
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()
RaV
la source
1

J'ajouterais que vous pouvez également l'utiliser pour appeler plusieurs émissions ou méthodes ou les deux ensemble en séparant par; point virgule

  @click="method1(); $emit('emit1'); $emit('emit2');"
jewcub
la source
-2

vous pouvez cependant faire quelque chose comme ceci:

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

oui, en utilisant l'événement html onclick natif.

Ardhi
la source