Làm cách nào để gọi nhiều hàm với @click in vue?


100

Câu hỏi:

Làm cách nào để gọi nhiều hàm trong một @click? (hay còn gọi là v-on:click)?

Tôi đã thử

  • Chia các hàm bằng dấu chấm phẩy : <div @click="fn1('foo');fn2('bar')"> </div>;

  • Sử dụng một số @click: <div @click="fn1('foo')" @click="fn2('bar')"> </div>;

nhưng làm thế nào để làm điều đó cho đúng?

Tái bút : Chắc chắn tôi luôn làm được

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

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

Nhưng đôi khi điều này không tốt đẹp.


10
Tạo trình xử lý một cú nhấp chuột và trong đó gọi hai hàm.
Tushar

3
Đúng, tôi có thể làm điều này, nhưng tôi hơi xấu một chút.
Sergei Panfilov

1
thêm một hàm bất thường để làm điều đó: <div v-on: click = "return function () {fn1 ('foo'); fn2 ('bar');} ()"> </div>
Wolfgang

@Wolfgang Thêm điều này làm câu trả lời (đây cuối cùng là một giải pháp thay thế).
Sergei Panfilov

1
Dưới đây là một cái gì đó dễ đọc hơn trong quan điểm của tôi, bạn có thể làm điều này: v-on:click="[click1($event), click2($event)]". Tôi đã trả lời nó bên dưới :)
Shailen Naidoo

Câu trả lời:


239

Trên Vue 2.3 trở lên, bạn có thể làm điều này:

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

2
Mát mẻ. Tôi đoán cái này phải mới cho 2,3? Không hoạt động trên 2.2.6 đối với tôi. Lý do chính đáng để nâng cấp nếu vậy.
RoccoB

cố gắng này, và tiếp tục với plainer câu trả lời vì tôi không thể tìm ra cách để vượt qua eventthông qua
Pirijan

4
thú vị cần lưu ý rằng dấu ngoặc đơn trong tên hàm được yêu cầu để hoạt động. v-on:click="firstFunction; secondFunction;"sẽ không hoạt động
Andre Ravazzi

3
@Pirijan Nó là ràng buộc để$event
Michael Mrozek

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

43

Trước hết, bạn có thể sử dụng ký hiệu ngắn @clickthay vì v-on:clickcho các mục đích dễ đọc.

Thứ hai, bạn có thể sử dụng trình xử lý sự kiện nhấp chuột gọi các hàm / phương thức khác như @Tushar đã đề cập trong nhận xét của anh ấy ở trên, vì vậy bạn kết thúc với một cái gì đó như sau:

<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

Nếu bạn muốn thứ gì đó dễ đọc hơn một chút, bạn có thể thử cách này:

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

Đối với tôi, giải pháp này có vẻ giống Vue hơn, hy vọng bạn sẽ thích


Đây có vẻ là giải pháp khó hiểu nhất. Có nhược điểm nào không?
Kiraa

1
@Kiraa Không, không phải là tôi đã tìm thấy vì tôi đã tìm ra cú pháp đó. Nếu tôi gặp bất cứ điều gì, tôi sẽ thêm nhận xét :)
Shailen Naidoo

1
Làm thế nào nếu bạn muốn e.stopPropagate()vào click1($event)để click2(event)không được xử lý?
Julio Motol

2
@JulioMotol click1($event)click2($event)chỉ là 2 chức năng khác nhau cho cùng một sự kiện chứ không phải 2 sự kiện khác nhau. e.stopPropagate()sẽ không làm bất cứ điều gì cho click2(). Hy vọng điều đó có ý nghĩa :)
Shailen Naidoo

Vì vậy, không có cách nào để ngừng click2($event)kích hoạt?
Julio Motol

11

để thêm một hàm bất thường để làm điều đó có thể là một giải pháp thay thế:

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

10
Một giải pháp thay thế ES6: @click = "() => {function1 (tham số); function2 (tham số);}"
AdamJB

Lưu ý quan trọng: nếu một trong các hàm lồng nhau của bạn cần $eventlà đối số, bạn sẽ cần chuyển nó dưới dạng tham số cho hàm mới của bạn để được sử dụng bên trong nó. Ví dụ. ($event) => {func1($event); func2('x');}
zcoop98

9

Tách thành từng miếng.

Nội tuyến:

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

HOẶC: Thông qua một hàm tổng hợp:

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

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

9

Cách đơn giản này để thực hiện v-on: click = "firstFunction (); secondFunction ();"


2
Tôi tin rằng điều này sẽ phá vỡ trình biên dịch và không hiển thị. Chỉ cần thử nó - đã phá vỡ.
Chris Johnson

Tôi có thể thấy bên dưới nó hoạt động đối với một số, nhưng bị hỏng ở 2.6.6 đối với tôi.
Chris Johnson

7

Điều này phù hợp với tôi khi bạn cần mở một hộp thoại khác bằng cách nhấp vào nút bên trong hộp thoại và cũng đóng hộp thoại này. Chuyển các giá trị dưới dạng tham số với dấu phân cách bằng dấu phẩy.

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

5

trong Vue 2.5.1 cho các nút hoạt động

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

4

Việc Vuexử lý sự kiện chỉ cho phép các cuộc gọi hàm đơn lẻ. Nếu bạn cần thực hiện nhiều cái, bạn có thể thực hiện một trình bao gồm cả hai:

<div @click="handler"></div>
////////////////////////////
handler: function() { //Syntax assuming its in the 'methods' option of Vue instance
    fn1('foo');
    fn2('bar');
}

BIÊN TẬP

Một tùy chọn khác là chỉnh sửa trình xử lý đầu tiên để có lệnh gọi lại và chuyển trình xử lý thứ hai vào.

<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

Tôi muốn nói thêm rằng bạn cũng có thể sử dụng điều này để gọi nhiều phát hoặc nhiều phương thức hoặc cả hai cùng nhau bằng cách tách với; dấu chấm phẩy

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

-2

Tuy nhiên, bạn có thể làm điều gì đó như sau:

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

có, bằng cách sử dụng sự kiện html onclick gốc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.