【问题标题】:How to call multiple functions with @click in vue?如何在vue中使用@click调用多个函数?
【发布时间】:2016-12-09 06:06:01
【问题描述】:

问题:

如何在一次@click 中调用多个函数? (又名v-on:click)?

我试过了

  • 用分号分割函数:<div @click="fn1('foo');fn2('bar')"> </div>;

  • 使用多个@click:<div @click="fn1('foo')" @click="fn2('bar')"> </div>;

但是如何正确地做呢?

P.S.:当然我总能做到

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

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

但有时这并不好。

【问题讨论】:

  • 创建单击处理程序并在其中调用两个函数。
  • 添加一个异常函数来做到这一点:

标签: javascript vue.js


【解决方案1】:

在 Vue 2.3 及更高版本上,您可以这样做:

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

【讨论】:

  • 方法是否保证按顺序执行?
【解决方案2】:

首先,为了便于阅读,您可以使用短符号 @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>

【讨论】:

    【解决方案3】:

    如果你想要一些更易读的东西,你可以试试这个:

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

    对我来说,这个解决方案感觉更像 Vue,希望你喜欢

    【讨论】:

    • 也可以做到@click="click1($event); click2($event)"。这里的重点是向处理函数添加显式事件参数。这样,每个方法都将获得相同的有效负载或原始事件数据。对于从子组件监听自定义事件的情况很重要
    【解决方案4】:

    添加一个异常函数来做到这一点可能是另一种选择:

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

    【讨论】:

    • 一个 ES6 替代方案:@click="() => { function1(parameters); function2(parameters); }"
    • 重要提示:如果您的嵌套函数之一需要 $event 作为 arg,则需要将其作为参数传递给新函数以在其中使用。例如。 ($event) =&gt; {func1($event); func2('x');}
    【解决方案5】:

    分成几块。

    内联:

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

    或:通过复合函数:

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

    【讨论】:

      【解决方案6】:

      这个简单的方法 v-on:click="firstFunction(); secondFunction();"

      【讨论】:

      • 我相信这会破坏编译器而不是渲染。刚试了一下 - 坏了。
      • 我可以在下面看到它适用于某些人,但对我来说在 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>
      

      【讨论】:

        【解决方案8】:

        在 Vue 2.5.1 中用于按钮工作

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

        【讨论】:

          【解决方案9】:

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

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              2021 年 12 月更新

              你需要用逗号分隔 像这样:

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

              【讨论】:

                【解决方案12】:

                我只想在这里添加一个我觉得在上面所有答案中都缺少的小部分;也就是说,当您想要添加多个点击处理程序时,您实际上需要调用该方法,而不仅仅是将其名称作为可调用传递。

                这可能会让人感到意外,因为 Vue 允许将可调用对象传递给 click 处理程序。

                这行得通

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

                这不是

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

                JsFiddle example

                【讨论】:

                  【解决方案13】:

                  我要补充一点,您还可以使用它来调用多个发射或方法,或通过用 ; 分隔来同时调用两者。分号

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

                  【讨论】:

                    【解决方案14】:

                    你可以用这个:

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

                    【讨论】:

                      【解决方案15】:

                      你可以这样做

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

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

                      【讨论】:

                        【解决方案16】:

                        只需执行以下操作:

                        • $event:

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

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

                        【讨论】:

                          【解决方案17】:

                          基于 ES6 的匿名函数:

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

                          【讨论】:

                            【解决方案18】:

                            但是,您可以这样做:

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

                            是的,通过使用原生 onclick html 事件。

                            【讨论】:

                              猜你喜欢
                              • 2015-02-27
                              • 2021-05-29
                              • 1970-01-01
                              • 2018-08-17
                              • 2010-10-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2018-09-28
                              • 1970-01-01
                              相关资源
                              最近更新 更多