Bagaimana cara memanggil beberapa fungsi dengan @click in vue?

103

Pertanyaan:

Bagaimana memanggil beberapa fungsi dalam satu @ klik? (alias v-on:click)?

Saya mencoba

  • Fungsi perpecahan dengan titik koma: <div @click="fn1('foo');fn2('bar')"> </div>;

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

tapi bagaimana melakukannya dengan benar?

PS : Yang pasti selalu bisa

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

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

Tapi terkadang ini tidak bagus.

Sergei Panfilov
sumber
10
Buat handler klik tunggal dan dalam panggilan itu dua fungsi.
Tushar
3
Ya, saya bisa melakukan ini, tapi saya agak jelek.
Sergei Panfilov
1
tambahkan fungsi anomim untuk melakukannya: <div v-on: click = "return function () {fn1 ('foo'); fn2 ('bar');} ()"> </div>
Wolfgang
@Wolfgang Tambahkan ini sebagai jawaban (akhirnya ini adalah solusi alternatif).
Sergei Panfilov
1
Berikut ini adalah sesuatu yang lebih mudah dibaca menurut pendapat saya, Anda dapat melakukan ini: v-on:click="[click1($event), click2($event)]". Saya menjawabnya di bawah :)
Shailen Naidoo

Jawaban:

245

Di Vue 2.3 dan yang lebih baru, Anda dapat melakukan ini:

<div v-on:click="firstFunction(); secondFunction();"></div>
// or
<div @click="firstFunction(); secondFunction();"></div>
Stuart Cusack
sumber
2
Keren. Saya kira ini pasti baru untuk 2.3? Tidak berfungsi pada 2.2.6 untuk saya. Alasan bagus untuk meningkatkan jika demikian.
RoccoB
mencoba ini, dan pergi dengan jawaban lebih jelas karena saya tidak tahu cara untuk lulus eventmelalui
Pirijan
5
menarik untuk dicatat bahwa tanda kurung di nama fungsi diperlukan agar berfungsi. v-on:click="firstFunction; secondFunction;"tidak akan bekerja
Andre Ravazzi
4
@Pirijan Ini terikat untuk$event
Michael Mrozek
1
@Pirijan <div @click="firstFunction($event); secondFunction($event);Et voilà :)
rdhainaut
44

Pertama-tama Anda dapat menggunakan notasi pendek, @clickbukan v-on:clickuntuk tujuan keterbacaan.

Kedua Anda bisa menggunakan event handler klik yang memanggil fungsi / metode lain sebagai @Tushar yang disebutkan dalam komentarnya di atas, jadi Anda akan mendapatkan sesuatu seperti ini:

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

Jika Anda menginginkan sesuatu yang sedikit lebih mudah dibaca, Anda dapat mencoba ini:

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

Bagi saya, solusi ini lebih terasa seperti harapan Vue yang Anda nikmati

Shailen Naidoo
sumber
Ini sepertinya solusi yang paling idiomatis. Apakah ada kekurangannya?
Kiraa
1
Kiraa Tidak, bukan yang saya temukan sejak saya menemukan sintaks itu. Jika saya mengalami sesuatu, saya akan menambahkan komentar :)
Shailen Naidoo
1
Bagaimana jika Anda ingin e.stopPropagate()di click1($event)sehingga click2(event)tidak akan ditangani?
Julio Motol
2
@JulioMotol click1($event)dan click2($event)hanya 2 fungsi berbeda untuk acara yang sama bukan 2 acara berbeda. e.stopPropagate()tidak akan melakukan apa pun untuk click2(). Harapan yang masuk akal :)
Shailen Naidoo
Jadi tidak ada cara untuk berhenti click2($event)memicu?
Julio Motol
12

untuk menambahkan fungsi anomim untuk melakukan itu mungkin merupakan alternatif:

<div v-on:click="return function() { fn1('foo');fn2('bar'); }()"> </div> 
Wolfgang
sumber
10
Alternatif ES6: @click = "() => {function1 (parameter); function2 (parameter);}"
AdamJB
Catatan penting: jika salah satu fungsi bertingkat Anda perlu $eventsebagai arg, Anda harus meneruskannya sebagai parameter ke fungsi baru Anda untuk digunakan di dalamnya. Misalnya. ($event) => {func1($event); func2('x');}
zcoop98
9

Pisahkan menjadi beberapa bagian.

Di barisan:

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

ATAU: Melalui fungsi komposit:

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

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

Cara sederhana untuk melakukan v-on: click = "firstFunction (); secondFunction ();"

Tuan Tidak ada
sumber
2
Saya yakin ini akan merusak kompiler dan tidak merender. Baru saja mencobanya - bangkrut.
Chris Johnson
Saya dapat melihat di bawah ini berfungsi untuk beberapa orang, tetapi istirahat di 2.6.6 untuk saya.
Chris Johnson
7

Ini berfungsi untuk saya ketika Anda perlu membuka kotak dialog lain dengan mengklik tombol di dalam kotak dialog dan juga menutup yang ini. Teruskan nilai sebagai params dengan pemisah koma.

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

di Vue 2.5.1 untuk karya tombol

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

The Vueevent handling hanya memungkinkan untuk panggilan fungsi tunggal. Jika Anda perlu melakukan lebih dari satu, Anda dapat melakukan pembungkus yang mencakup keduanya:

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

EDIT

Opsi lainnya adalah mengedit penangan pertama agar memiliki panggilan balik dan meneruskan penangan kedua.

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

Saya akan menambahkan, bahwa Anda juga dapat menggunakan ini untuk memanggil beberapa emit atau metode atau keduanya bersama-sama dengan memisahkan dengan; titik koma

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

Anda bisa, bagaimanapun, melakukan sesuatu seperti ini:

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

ya, dengan menggunakan acara html onclick asli.

Ardhi
sumber