Как вызвать несколько функций с помощью v-on: нажмите

Как вызвать несколько функций в одном v-on событие? Нет разницы: щелчок, фокус или что-то еще?

Что-то вроде:

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

Или, может быть:

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

Как это сделать правильно?

ОБНОВЛЕНИЕ: Да, конечно, я всегда могу сделать

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

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

Но это действительно ужасно.

20 ответов

Решение

Прежде всего вы можете использовать краткую запись @click вместо v-on:click для удобства чтения.

Во-вторых, вы можете использовать обработчик события 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>

Я на Vue 2.3, и я могу сделать это:

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

Если вы хотите что-то более читаемое, вы можете попробовать следующее:

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

Для меня это решение больше похоже на Vue, надеюсь, вам понравится

обновлено декабрь 2021 г.

вам нужно отделить запятой, как это:

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

Чтобы добавить аномимную функцию, это может быть альтернативой:

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

Разделить на кусочки.

В соответствии:

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

ИЛИ: через составную функцию:

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

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

Я просто хочу добавить сюда один небольшой недостающий бит, которого мне не хватало во всех приведенных выше ответах; то есть вам действительно нужно вызвать метод, а не просто передать его имя как вызываемое, когда вы хотите добавить несколько обработчиков кликов.

Это может стать сюрпризом, поскольку 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

Это простой способ сделать v-on:click="firstFunction(); secondFunction();"

Это работает для мужчин, когда вам нужно открыть другое диалоговое окно, нажав кнопку рядом с полем диалога, а также закрыть это окно. Передать значения как параметр с разделителем запятыми.

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

На основе ES6 с анонимными функциями:

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

В Vue 2.5.1 для работы кнопок

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

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

Вы можете использовать это:

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

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

Просто сделайте так, как показано ниже:

  • с :

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

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

Вы можете сделать это как

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

ИЛИ

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

Вы можете написать javascript как обычную многострочную строку:

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

Я бы добавил, что вы также можете использовать это для вызова нескольких излучений или методов или обоих вместе, разделив их с помощью; точка с запятой

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

Я также искал это решение и использовал разные методы, и я нашел этот лучший для меня. Только что поделился с вами ***Вы можете использовать литералы шаблонов для использования нескольких функций в одном событии в vuejs

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

Примечание: я использую vue3.

Однако вы можете сделать что-то вроде этого:

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

да, с помощью нативного html-события onclick.

Другие вопросы по тегам