¿Cómo llamar a múltiples funciones con @click en vue?

103

Pregunta:

¿Cómo llamar a múltiples funciones en un solo @click? (alias v-on:click)?

Lo intenté

  • Dividir funciones con un punto y coma: <div @click="fn1('foo');fn2('bar')"> </div>;

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

pero ¿cómo hacerlo correctamente?

PD : seguro que siempre puedo hacer

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

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

Pero a veces esto no es agradable.

Sergei Panfilov
fuente
10
Cree un controlador de un solo clic y, en ese caso, llame a dos funciones.
Tushar
3
Sí, puedo hacer esto, pero en mi humilde opinión un poco feo.
Sergei Panfilov
1
agregue una función anónima para hacer eso: <div v-on: click = "return function () {fn1 ('foo'); fn2 ('bar');} ()"> </div>
Wolfgang
@Wolfgang Agregue esto como respuesta (esta es por fin una solución alternativa).
Sergei Panfilov
1
Aquí es algo más fácil de leer en mi opinión, usted puede hacer esto: v-on:click="[click1($event), click2($event)]". Lo respondí a continuación :)
Shailen Naidoo

Respuestas:

245

En Vue 2.3 y superior puedes hacer esto:

<div v-on:click="firstFunction(); secondFunction();"></div>
// or
<div @click="firstFunction(); secondFunction();"></div>
Stuart Cusack
fuente
2
Frio. Supongo que esto debe ser nuevo para 2.3. No funciona en 2.2.6 para mí. Buena razón para actualizar si es así.
RoccoB
intentado esto, y fue con las respuestas más sencillas porque no podía encontrar la manera de pasar eventa través de
Pirijan
5
Es interesante notar que el paréntesis en el nombre de la función es necesario para funcionar. v-on:click="firstFunction; secondFunction;"no funcionará
Andre Ravazzi
4
@Pirijan Está destinado a$event
Michael Mrozek
1
@Pirijan <div @click="firstFunction($event); secondFunction($event);Et voilà :)
rdhainaut
44

En primer lugar, puede utilizar la notación corta en @clicklugar de v-on:clickcon fines de legibilidad.

En segundo lugar, puede usar un controlador de eventos de clic que llame a otras funciones / métodos como @Tushar mencionó en su comentario anterior, por lo que terminará con algo como esto:

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

Si quieres algo un poco más legible, puedes probar esto:

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

Para mí, esta solución se siente más como Vue, espero que disfrutes

Shailen Naidoo
fuente
Esta parece la solución más idiomática. ¿Hay algún inconveniente?
Kiraa
1
@Kiraa No, no es que lo haya encontrado desde que descubrí esa sintaxis. Si me encuentro con algo, agregaré un comentario :)
Shailen Naidoo
1
Cómo si quieres e.stopPropagate()en la click1($event)manera que click2(event)solía ser manejado?
Julio Motol
2
@JulioMotol click1($event)y click2($event)son solo 2 funciones diferentes para el mismo evento, no 2 eventos diferentes. e.stopPropagate()no haré nada por click2(). Espero que tenga sentido :)
Shailen Naidoo
Entonces, ¿no hay forma de evitar que se click2($event)active?
Julio Motol
12

para agregar una función anónima para hacer eso puede ser una alternativa:

<div v-on:click="return function() { fn1('foo');fn2('bar'); }()"> </div> 
Wolfgang
fuente
10
Una alternativa de ES6: @click = "() => {
función1
Nota importante: si una de sus funciones anidadas necesita $eventun argumento, deberá pasarla como un parámetro a su nueva función para que se use dentro de ella. P.ej. ($event) => {func1($event); func2('x');}
zcoop98
9

Separa en pedazos.

En línea:

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

O: A través de una función compuesta:

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

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

Esta forma simple de hacer v-on: click = "firstFunction (); secondFunction ();"

señor don nadie
fuente
2
Creo que esto romperá el compilador y no se procesará. Lo intenté, se rompió.
Chris Johnson
Puedo ver a continuación que funciona para algunos, pero se rompe en 2.6.6 para mí.
Chris Johnson
7

Esto funciona para mí cuando necesita abrir otro cuadro de diálogo haciendo clic en un botón dentro de un cuadro de diálogo y también cerrar este. Pase los valores como parámetros con un separador de coma.

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

en Vue 2.5.1 para trabajos de botón

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

El Vuemanejo de eventos solo permite llamadas a funciones únicas. Si necesita hacer varios, puede hacer un contenedor que incluya ambos:

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

EDITAR

Otra opción es editar el primer controlador para tener una devolución de llamada y pasar el segundo.

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

Yo agregaría que también puede usar esto para llamar a múltiples emisiones o métodos o ambos juntos separando con; punto y coma

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

Sin embargo, puedes hacer algo como esto:

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

sí, mediante el uso del evento html nativo onclick.

Ardhi
fuente