Jak wywołać wiele funkcji za pomocą @click w vue?

107

Pytanie:

Jak wywołać wiele funkcji jednym kliknięciem @click? (aka v-on:click)?

próbowałem

  • Podział funkcji średnikiem: <div @click="fn1('foo');fn2('bar')"> </div>;

  • Użyj kilka @click: <div @click="fn1('foo')" @click="fn2('bar')"> </div>;

ale jak to zrobić poprawnie?

PS : Na pewno zawsze mogę

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

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

Ale czasami to nie jest miłe.

Siergiej Panfiłow
źródło
10
Utwórz procedurę obsługi pojedynczego kliknięcia i wywołaj dwie funkcje.
Tushar
3
Tak, mogę to zrobić, ale ja jestem trochę brzydki.
Siergiej Panfiłow
1
dodaj w tym celu anomalną funkcję: <div v-on: click = "return function () {fn1 ('foo'); fn2 ('bar');} ()"> </div>
Wolfgang
@Wolfgang Dodaj to jako odpowiedź (to w końcu jest alternatywne rozwiązanie).
Siergiej Panfiłow
1
Oto coś bardziej czytelny moim zdaniem, można to zrobić: v-on:click="[click1($event), click2($event)]". Odpowiedziałem poniżej :)
Shailen Naidoo

Odpowiedzi:

257

W Vue 2.3 i nowszych możesz to zrobić:

<div v-on:click="firstFunction(); secondFunction();"></div>
// or
<div @click="firstFunction(); secondFunction();"></div>
Stuart Cusack
źródło
2
Fajne. Myślę, że to musi być nowe dla 2.3? U mnie nie działa na 2.2.6. Dobry powód do aktualizacji, jeśli tak.
RoccoB,
próbowałem, i udał się z odpowiedziami jaśniej, bo nie mogłem dowiedzieć się, jak przejść eventprzez
Pirijan
6
Warto zauważyć, że nawiasy w nazwie funkcji są wymagane do działania. v-on:click="firstFunction; secondFunction;"nie zadziała
Andre Ravazzi
5
@Pirijan To musi$event
Michael Mrozek
1
@Pirijan <div @click="firstFunction($event); secondFunction($event);Et voilà :)
rdhainaut
46

Przede wszystkim możesz użyć krótkiej notacji @clickzamiast v-on:clickdla czytelności.

Po drugie, możesz użyć modułu obsługi zdarzenia kliknięcia, który wywołuje inne funkcje / metody, jak @Tushar wspomniany w jego komentarzu powyżej, więc otrzymasz coś takiego:

<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
źródło
19

Jeśli chcesz czegoś bardziej czytelnego, możesz spróbować tego:

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

Wydaje mi się, że to rozwiązanie bardziej przypomina nadzieję Vue, którą lubisz

Shailen Naidoo
źródło
Wydaje się, że jest to najbardziej idiomatyczne rozwiązanie. Czy są jakieś wady?
Kiraa
1
@Kiraa Nie, nie to, co znalazłem, odkąd odkryłem tę składnię. Jeśli coś
napotkam,
1
Jak jeśli chcesz e.stopPropagate()na click1($event)tak, że click2(event)przyzwyczajenie obchodzić?
Julio Motol
2
@JulioMotol click1($event)i click2($event)to tylko 2 różne funkcje dla tego samego wydarzenia, a nie 2 różne wydarzenia. e.stopPropagate()nic nie zrobi dla click2(). Mam nadzieję, że to ma sens :)
Shailen Naidoo
1
Więc nie ma sposobu, aby zatrzymać click2($event)wyzwalanie?
Julio Motol
13

aby dodać anomymalną funkcję, która może być alternatywą:

<div v-on:click="return function() { fn1('foo');fn2('bar'); }()"> </div> 
Wolfgang
źródło
11
Alternatywa dla ES6: @click = "() => {
funkcja1
Ważna uwaga: jeśli jedna z twoich zagnieżdżonych funkcji wymaga $eventjako argumentu, musisz przekazać ją jako parametr do swojej nowej funkcji, aby była używana wewnątrz niej. Na przykład. ($event) => {func1($event); func2('x');}
zcoop98
9

Podzielić na kawałki.

W treści:

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

LUB: Poprzez funkcję złożoną:

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

<script>
var app = new Vue({
  // ...
  methods: {
    f3: function() { f1() + f2(); }
    f1: function() {},
    f2: function() {}
  }
})
</script>
Inanc Gumus
źródło
9

Ten prosty sposób na v-on: click = "firstFunction (); secondFunction ();"

Pan Nikt
źródło
2
Wierzę, że to zepsuje kompilator i nie wyrenderuje. Po prostu spróbowałem - zepsuł się.
Chris Johnson
Widzę poniżej, że działa to dla niektórych, ale u mnie psuje się w 2.6.6.
Chris Johnson
7

Działa to w przypadku mnie, gdy musisz otworzyć inne okno dialogowe, klikając przycisk w oknie dialogowym, a także zamknąć to. Przekaż wartości jako parametry z separatorem przecinkiem.

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

w Vue 2.5.1 dla przycisku działa

 <button @click="firstFunction(); secondFunction();">Ok</button>
Zhurov Konstantin
źródło
4

Obsługa Vuezdarzeń dopuszcza tylko pojedyncze wywołania funkcji. Jeśli chcesz zrobić wiele z nich, możesz zrobić opakowanie, które zawiera oba:

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

EDYTOWAĆ

Inną opcją jest edytowanie pierwszego modułu obsługi tak, aby miał wywołanie zwrotne i przekazanie drugiego.

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

Dodałbym, że możesz również użyć tego do wywołania wielu emisji lub metod lub obu razem, oddzielając za pomocą; średnik

  @click="method1(); $emit('emit1'); $emit('emit2');"
jewcub
źródło
-2

możesz jednak zrobić coś takiego:

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

tak, używając natywnego zdarzenia html onclick.

Ardhi
źródło