205

How can I call multiple functions in a single @click? (aka v-on:click)?

So far I tried

  • Splitting the functions with a semicolon: <div @click="fn1('foo');fn2('bar')"> </div>;

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

and as a workaround, I can just create a handler:

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

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

But sometimes this isn't nice. What would be the proper method/syntax?

1

21 Answers 21

413

On Vue 2.3 and above you can do this:

<div v-on:click="firstFunction(); secondFunction();"></div>
// or
<div @click="firstFunction(); secondFunction();"></div>
Sign up to request clarification or add additional context in comments.

6 Comments

are the methods guaranteed to execute in order?
This produces a warning on Vue.js v2.6.14: unreachable code after return statement If that bothers anyone - you can always try something like this: <div @click="()=>{firstFunction(); secondFunction();}"></div>
Not recommended for those who have prettier with "semi": false because will remove the semicolon. I recommend the plus sign between the name of the functions.
This works while leaving away the function braces () did not work.
Does not work in Vue3. useToggle is worthless without a callback
|
53

First of all you can use the short notation @click instead of v-on:click for readability purposes.

Second You can use a click event handler that calls other functions/methods as @Tushar mentioned in his comment above, so you end up with something like this :

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

2 Comments

Not helpful if you use useToggle in @vueuse/core
I strongly believe that my answer is more Vue-like stackoverflow.com/a/58744983/7854594
48

If you want something a little bit more readable, you can try this:

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

To me, this solution feels more Vue-like hope you enjoy

1 Comment

also can do @click="click1($event); click2($event)". Here the main point is adding explicit event argument to the handler function. This way each method will get the same payload or the original event data. Important for the cases when you listen to custom event from Child component
30

updated dec-2021

you need to separate with a comma like this:

<button @click="open(), onConnect()">Connect Wallet</button>

Comments

16

to add an anomymous function to do that may be an alternative:

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

2 Comments

An ES6 alternative: @click="() => { function1(parameters); function2(parameters); }"
Important note: if one of your nested functions need $event as an arg, you'll need to pass it as a parameter to your new function to be used inside of it. Eg. ($event) => {func1($event); func2('x');}
11

Separate into pieces.

Inline:

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

OR: Through a composite function:

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

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

Comments

11

I just want to add one small missing bit here which I felt missing in all of the answers above; that is you actually need to call the method rather than just passing its name as callable, when want to add multiple click handlers.

This might come as a surprise since Vue allows passing a callable to the click handler.

This works

<div><button @click="foo(); bar();">Button1</button></div>
<div><button @click="foo">Button2</button></div>

This does not

<div><button @click="foo; bar;">Button3</button></div>

JsFiddle example

Comments

9

This simple way to do v-on:click="firstFunction(); secondFunction();"

2 Comments

I believe this will break the compiler and not render. Just tried it - broke.
I can see below it works for some, but breaks in 2.6.6 for me.
8

This works for me when you need to open another dialog box by clicking a button inside a dialogue box and also close this one. Pass the values as params with a comma separator.

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

Comments

6

in Vue 2.5.1 for button works

 <button @click="firstFunction(); secondFunction();">Ok</button>

Comments

6

Based on ES6 with anonymous functions:

<button @click="() => { function1(); function2(); }"></button>

Comments

5

The Vue event handling only allows for single function calls. If you need to do multiple ones you can either do a wrapper that includes both:

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

EDIT

Another option is to edit the first handler to have a callback and pass the second in.

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

Comments

3

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

Comments

3

You can use this:

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

Comments

3

Simply do like below:

  • with $event:

    <div @click="function1($event, param1); function2($event,param1);"></div>
    
  • without $event:

    <div @click="function1(param1); function2(param1);"></div>
    

Comments

2

You can do it like

<button v-on:click="Function1(); Function2();"></button>

OR

<button @click="Function1(); Function2();"></button>

Comments

1

I'd add, that you can also use this to call multiple emits or methods or both together by separating with ; semicolon

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

Comments

1

I was also looking this solution and used different methods and I found this one best for me. Just shared with you ***You can use template literals to use multiple function in one event in vuejs

<div @click="`${firstFunction() ${secondFunction() ${thirdFucntion()}`"></div>

Note:I am using vue3.

1 Comment

Are you sure this doesn't actually execute the three function when the component is rendered (rather than when this div is clicked)?
1

You can write javascript as a normal multiline:

@click="(event) => {
          console.log(event);
          console.log("Second log");
        }"

1 Comment

Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.
1

I've found a mix seems to work (Vue 2.6.10)

<button type="button" class="btn btn-default" 
    @click="buttonClicked('Back to Dash');[handlerClose(),$router.push({name:'dash',params:{
    id:id, previous:componentInfo}})]" 
    role="button">Back to Dash {{ dashNumber }}</button>

buttonClicked() logs its argument to console. So semi-colon separated followed by array of functions seems to work. componentInfo is just object that contains name and template name of the previous component (useful for debugging).

Comments

-2

you can, however, do something like this :

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

yes, by using native onclick html event.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.