如何在Vue中使用@click调用多个功能?


101

题:

如何在单个@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
创建单击处理程序,然后在其中调用两个函数。
Tushar'8

3
是的,我可以这样做,但是恕我直言有点难看。
谢尔盖·潘菲洛夫

1
添加一个功能强大的函数来做到这一点:<div v-on:click =“ return function(){fn1('foo'); fn2('bar');}()”> </ div>
Wolfgang

@Wolfgang将此添加为答案(这是最后一个替代解决方案)。
谢尔盖·潘菲洛夫

1
我认为这是更容易理解的内容,您可以执行以下操作:v-on:click="[click1($event), click2($event)]"。我在下面回答了:)
Shailen Naidoo

Answers:


242

在Vue 2.3及更高版本上,您可以执行以下操作:

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

2
凉。我想这一定是2.3的新功能吗?对我来说不适用于2.2.6。如果是的话,有充分的理由进行升级。
RoccoB

尝试了一下,并给出了更简单的答案,因为我不知道如何event通过
Pirijan

4
有趣的是,需要使用函数名称中的括号。v-on:click="firstFunction; secondFunction;"将无法正常工作
安德烈Ravazzi

3
@Pirijan它必定会$event
Michael Mrozek

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

43

首先,您可以使用简称@click来代替v-on:click可读性。

其次,您可以使用单击事件处理程序,以调用其他函数/方法,如@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,自从我弄清楚该语法以来就没有找到它。如果确实遇到任何问题,我会添加一条评论:)
Shailen Naidoo

1
如何,如果你想e.stopPropagate()click1($event),这样click2(event)不会处理?
Julio Motol

2
@JulioMotol click1($event)click2($event)只是同一事件的2个不同功能,而不是2个不同的事件。e.stopPropagate()不会做任何事情click2()。希望有意义:)
Shailen Naidoo

所以有没有办法阻止click2($event)触发?
胡里奥·莫托尔

11

添加一个统一的功能来做到这一点可能是另一种选择:

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

10
一个ES6替代方案:@click =“()=> {function1(parameters); function2(parameters ;;}”
AdamJB

重要说明:如果您需要$event将一个嵌套函数用作arg,则需要将其作为参数传递给要在其中使用的新函数。例如。($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
我相信这会破坏编译器而不是渲染。刚刚尝试-摔坏了。
克里斯·约翰逊

我可以在下面看到它的某些功能,但对我来说在2.6.6中有所突破。
克里斯·约翰逊

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');
}

编辑

另一个选择是编辑第一个处理程序以具有回调并传递第二个处理程序。

<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

我要补充一点,您还可以使用;通过与;分开来调用多个emit或方法,或同时调用这两者。分号

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

-2

您可以执行以下操作:

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

是的,通过使用本机onclick html事件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.