Як викликати кілька функцій за допомогою @click in vue?


103

Питання:

Як викликати кілька функцій в одному @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 Додайте це як відповідь (це нарешті альтернативне рішення).
Сергій Панфілов

1
Ось що - то більш читабельним на мій погляд, ви можете зробити це: v-on:click="[click1($event), click2($event)]". Я відповів на це нижче :)
Шайлен Найду

Відповіді:


245

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

5
Цікаво відзначити, що дужки в назві функції потрібні для роботи. v-on:click="firstFunction; secondFunction;"не буде працювати
Андре

4
@Pirijan Це обов’язково$event
Michael Mrozek

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

44

Перш за все, ви можете використовувати коротке позначення @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>

15

Якщо ви хочете щось трохи читабельніше, ви можете спробувати це:

<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(). Сподіваюся, це має сенс :)
Шайлен Найду

Тож неможливо зупинити click2($event)спрацьовування?
Хуліо Мотол,

12

додати аномальну функцію, яка може бути альтернативою:

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

10
Альтернатива ES6: @click = "() => {function1 (параметри); function2 (параметри);}"
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>

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

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

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

-2

Ви можете, однак, зробити щось подібне:

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

так, за допомогою власної події onclick html.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.