Как вызвать несколько функций с помощью @click в vue?

108

Вопрос:

Как вызвать несколько функций за один @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
Создайте обработчик одиночного щелчка и в нем вызовите две функции.
Тушар
3
Да, я могу это сделать, но, по-моему, немного некрасиво.
Сергей Панфилов
1
добавьте для этого аномальную функцию: <div v-on: click = "return function () {fn1 ('foo'); fn2 ('bar');} ()"> </div>
Wolfgang
@Wolfgang Добавьте это как ответ (это, наконец, альтернативное решение).
Сергей Панфилов
1
Вот что - то более читаемым на мой взгляд, вы можете сделать это: v-on:click="[click1($event), click2($event)]". Я ответила на него ниже :)
Шейлен Найду

Ответы:

260

В 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
6
Интересно отметить, что круглые скобки в имени функции необходимы для работы. v-on:click="firstFunction; secondFunction;"не сработает
Андре Равацци
5
@Pirijan Это обязательно$event
Майкл
1
@Pirijan <div @click="firstFunction($event); secondFunction($event);Et voilà :)
rdhainaut
46

Прежде всего, вы можете использовать короткие обозначения, @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>
ismnoiet
источник
20

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

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

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

Шайлен Найду
источник
Это кажется наиболее идиоматическим решением. Есть ли недостатки?
Кираа
1
@Kiraa Нет, не то, чтобы я нашел, так как я понял этот синтаксис. Если я с чем-то столкнусь, я добавлю комментарий :)
Шейлен Найду
1
Как , если вы хотите , чтобы e.stopPropagate()на click1($event)так , что click2(event)привычка обращаться?
Хулио Мотол
2
@JulioMotol click1($event)и click2($event)просто 2 разные функции для того же события не 2 разных событий. e.stopPropagate()ничего не сделаю для click2(). Надеюсь, что это имеет смысл :)
Шейлен Найду
1
То есть нет возможности остановить click2($event)срабатывание?
Хулио Мотол
13

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

<div v-on:click="return function() { fn1('foo');fn2('bar'); }()"> </div> 
Вольфганг
источник
11
Альтернатива ES6: @click = "() => {function1 (parameters); function2 (parameters);}"
AdamJB
Важное примечание: если одна из ваших вложенных функций требуется $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>
Inanc Gumus
источник
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>
user2841183
источник
5

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

 <button @click="firstFunction(); secondFunction();">Ok</button>
Журов Константин
источник
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);
}
m_callens
источник
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()
RaV
источник
1

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

  @click="method1(); $emit('emit1'); $emit('emit2');"
еврей
источник
-2

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

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

да, используя собственное событие onclick html.

Арди
источник