Vueで@clickを使用して複数の関数を呼び出す方法は?


100

質問:

単一の@clickで複数の関数を呼び出す方法は?(別名v-on:click)?

私は試した

  • 関数をセミコロンで分割します<div @click="fn1('foo');fn2('bar')"> </div>

  • いくつかを使用し@clickます<div @click="fn1('foo')" @click="fn2('bar')"> </div>

しかし、それを正しく行う方法は?

PS:確かに私はいつでもできる

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

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

しかし、これは時には良くありません。


10
シングルクリックハンドラーを作成し、その中で2つの関数を呼び出します。
Tushar

3
ええ、私はこれを行うことができますが、私は少し醜いです。
セルゲイパンフィロフ2016

1
これを行うには、匿名の関数を追加します。<div v-on:click = "return function(){fn1( 'foo'); fn2( 'bar');}()"> </ div>
Wolfgang

@Wolfgangこれを回答として追加します(これはようやく代替ソリューションになります)。
セルゲイパンフィロフ2016

1
私の意見では、これはもっと読みやすいものですv-on:click="[click1($event), click2($event)]"。これを行うことができます:。私は以下で答えました:)
Shailen Naidoo

回答:


239

Vue 2.3以降では、これを行うことができます:

<div v-on:click="firstFunction(); secondFunction();"></div>
// or
<div @click="firstFunction(); secondFunction();"></div>

2
涼しい。これは2.3の新機能であると思いますか?2.2.6では動作しません。もしそうなら、アップグレードする正当な理由。
RoccoB 2017

これを試みたが、私が合格する方法を見つけ出すことができなかったので、地味解答と一緒に行ったeventを通じて
Pirijan

4
関数名の括弧が機能する必要があることに注意してください。v-on:click="firstFunction; secondFunction;"機能しません
Andre Ravazzi

3
@Pirijanそれはバインドされています$event
マイケルMrozek

1
@Pirijan Etvoilà <div @click="firstFunction($event); secondFunction($event);:)
rdhainaut

43

まず最初に、読みやすさのため@clickv-on:clickはなく、短い表記法を使用できます。

2つ目は、上記のコメントで述べた@Tusharのように、他の関数/メソッドを呼び出すクリックイベントハンドラーを使用できるため、次のような結果になります。

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

14

もう少し読みやすいものが欲しい場合は、これを試すことができます:

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

私にとって、このソリューションはVueのような希望を感じます


これは最も慣用的な解決策のようです。欠点はありますか?
キラー

1
@Kiraa Nope、その構文を理解してから発見したのではありません。何かに
遭遇したら

1
どのようにしたい場合e.stopPropagate()にはclick1($event)そうclick2(event)処理することが文句を言いませんか?
Julio Motol

2
@JulioMotol click1($event)click2($event)同じイベントのためだけに2異なる機能ではない2つの異なるイベントです。e.stopPropagate()は何もしませんclick2()。理にかなっていることを願っています:)
Shailen Naidoo

したがってclick2($event)、トリガーを停止する方法はありませんか?
Julio Motol

11

それを行うために匿名関数を追加することは代替かもしれません:

<div v-on:click="return function() { fn1('foo');fn2('bar'); }()"> </div> 

10
ES6の代替:@click = "()=> {function1(parameters); function2(parameters);}"
AdamJB

重要な注意:ネストされた関数の1つが$event引数として必要な場合は、その関数をパラメーターとして、その内部で使用される新しい関数に渡す必要があります。例えば。($event) => {func1($event); func2('x');}
zcoop98

9

バラバラにする。

列をなして:

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

または:複合関数を通じて:

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

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

9

v-on:click = "firstFunction(); secondFunction();"を実行するこの簡単な方法


2
これはコンパイラを壊し、レンダリングしないと思います。試してみた-壊れた。
Chris Johnson、

以下で確認できますが、一部は動作しますが、2.6.6では動作しません。
Chris Johnson、

7

これは、ダイアログボックス内のボタンをクリックして別のダイアログボックスを開き、このダイアログボックスを閉じる必要がある場合に役立ちます。カンマ区切りのパラメータとして値を渡します。

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


4

Vueイベント処理は、単一の関数呼び出しが可能になります。複数のものを行う必要がある場合は、両方を含むラッパーを実行できます。

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

編集する

別のオプションは、最初のハンドラーを編集してコールバックを持ち、2番目のハンドラーを渡すことです。

<div @click="fn1('foo', fn2)"></div>
////////////////////////////////////
fn1: function(value, callback) {
    console.log(value);
    callback('bar');
},
fn2: function(value) {
    console.log(value);
}

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()

1

さらに、これを使用して、で区切ることにより、複数の発行またはメソッド、あるいはその両方を一緒に呼び出すこともできます。セミコロン

  @click="method1(); $emit('emit1'); $emit('emit2');"

-2

ただし、次のようなことはできます。

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

はい、ネイティブのonclick htmlイベントを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.