Como chamar funções múltiplas com @click in vue?

102

Questão:

Como chamar várias funções em um único @click? (também conhecido como v-on:click)?

eu tentei

  • As funções rachadas com um ponto e vírgula: <div @click="fn1('foo');fn2('bar')"> </div>;

  • Use vários @click: <div @click="fn1('foo')" @click="fn2('bar')"> </div>;

mas como fazer isso corretamente?

PS : Com certeza sempre posso fazer

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

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

Mas às vezes isso não é legal.

Sergei Panfilov
fonte
10
Crie um manipulador de clique único e nessa chamada duas funções.
Tushar
3
Sim, eu posso fazer isso, mas sou um pouco feio.
Sergei Panfilov
1
adicione uma função anônima para fazer isso: <div v-on: click = "return function () {fn1 ('foo'); fn2 ('bar');} ()"> </div>
Wolfgang
@Wolfgang Adicione isso como uma resposta (esta é, finalmente, uma solução alternativa).
Sergei Panfilov
1
Aqui é algo mais legível, na minha opinião, você pode fazer isso: v-on:click="[click1($event), click2($event)]". Eu respondi abaixo :)
Shailen Naidoo

Respostas:

242

No Vue 2.3 e superior, você pode fazer isso:

<div v-on:click="firstFunction(); secondFunction();"></div>
// or
<div @click="firstFunction(); secondFunction();"></div>
Stuart Cusack
fonte
2
Legal. Eu acho que isso deve ser novo para 2.3? Não funciona no 2.2.6 para mim. Um bom motivo para atualizar se assim for.
RoccoB
tentei isso, e foi com as respostas mais claras, porque eu não conseguia descobrir como passar eventatravés de
Pirijan
4
interessante notar que o parêntese no nome da função é necessário para funcionar. v-on:click="firstFunction; secondFunction;"não funcionará
Andre Ravazzi
4
@Pirijan Está destinado a$event
Michael Mrozek
1
@Pirijan <div @click="firstFunction($event); secondFunction($event);Et voilà :)
rdhainaut
43

Em primeiro lugar, você pode usar a notação curta em @clickvez de v-on:clickpara fins de legibilidade.

Segundo, você pode usar um manipulador de eventos de clique que chama outras funções / métodos como @Tushar mencionou em seu comentário acima, então você acaba com algo assim:

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

Se você quiser algo um pouco mais legível, pode tentar isto:

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

Para mim, essa solução parece mais Vue, espero que você goste

Shailen Naidoo
fonte
Esta parece ser a solução mais idiomática. Existem desvantagens?
Kiraa
1
@Kiraa Não, não que eu tenha descoberto desde que descobri essa sintaxe. Se eu encontrar algo, adicionarei um comentário :)
Shailen Naidoo
1
Que tal se você quiser e.stopPropagate()ligar click1($event)para que click2(event)não seja atendido?
Julio Motol
2
@JulioMotol click1($event)e click2($event)são apenas 2 funções diferentes para o mesmo evento e não 2 eventos diferentes. e.stopPropagate()não fará nada para click2(). Espero que faça sentido :)
Shailen Naidoo
Portanto, não há como parar click2($event)de disparar?
Julio Motol
11

adicionar uma função anônima para fazer isso pode ser uma alternativa:

<div v-on:click="return function() { fn1('foo');fn2('bar'); }()"> </div> 
Wolfgang
fonte
10
Uma alternativa ES6: @click = "() => {
função1
Observação importante: se uma de suas funções aninhadas precisar $eventcomo um argumento, você precisará passá-la como um parâmetro para sua nova função a ser usada dentro dela. Por exemplo. ($event) => {func1($event); func2('x');}
zcoop98
9

Separe em pedaços.

Na linha:

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

OU: Por meio de uma função composta:

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

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

Esta maneira simples de fazer v-on: click = "firstFunction (); secondFunction ();"

senhor ninguém
fonte
2
Eu acredito que isso vai quebrar o compilador e não renderizar. Apenas tentei - quebrou.
Chris Johnson
Posso ver abaixo que funciona para alguns, mas quebra no 2.6.6 para mim.
Chris Johnson
7

Isso funciona para mim quando você precisa abrir outra caixa de diálogo clicando em um botão dentro de uma caixa de diálogo e também fechar esta. Passe os valores como parâmetros com um separador de vírgula.

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

no Vue 2.5.1 para funções de botão

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

O Vuetratamento de eventos permite apenas chamadas de função única. Se precisar fazer vários, você pode criar um wrapper que inclua ambos:

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

EDITAR

Outra opção é editar o primeiro manipulador para ter um retorno de chamada e passar o segundo.

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

Eu acrescentaria que você também pode usar isso para chamar vários emits ou métodos, ou ambos juntos, separando com; ponto e vírgula

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

você pode, no entanto, fazer algo assim:

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

sim, usando evento html onclick nativo.

Ardhi
fonte