vue에서 @click으로 여러 함수를 호출하는 방법은 무엇입니까?


102

질문:

단일 @click에서 여러 함수를 호출하는 방법은 무엇입니까? (일명 v-on:click)?

나는 시도했다

  • 세미콜론으로 함수 분할 : <div @click="fn1('foo');fn2('bar')"> </div>;

  • 여러 가지 사용 @click: <div @click="fn1('foo')" @click="fn2('bar')"> </div>;

하지만 제대로하는 방법?

추신 : 확실히 나는 항상 할 수 있습니다

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

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

그러나 때때로 이것은 좋지 않습니다.


10
단일 클릭 핸들러를 만들고 두 개의 함수를 호출합니다.
Tushar

3
네, 할 수 있지만 조금 못생긴 임호.
Sergei Panfilov

1
이를 위해 anomymous 함수를 추가하십시오. <div v-on : click = "return function () {fn1 ( 'foo'); fn2 ( 'bar');} ()"> </ div>
Wolfgang

@Wolfgang 이것을 대답으로 추가하십시오 (마침내 대체 솔루션입니다).
Sergei Panfilov

1
제 생각에는 더 읽기 쉬운 것이 있습니다 v-on:click="[click1($event), click2($event)]". 이렇게 할 수 있습니다 .. 나는 그것을 아래에 대답했다 :)
Shailen Naidoo

답변:


242

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

4
흥미로운 점은 함수 이름의 괄호가 작동하는 데 필요하다는 것입니다. v-on:click="firstFunction; secondFunction;"작동하지 않습니다
Andre Ravazzi 19.06.12

4
그것은에 바인딩 된 @Pirijan$event
마이클 Mrozek

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

43

먼저 짧은 표기법을 사용할 수 있습니다. @clickv-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와 같은 희망을 더 느낍니다.


이것은 가장 관용적 인 해결책처럼 보입니다. 단점이 있습니까?
Kiraa

1
@Kiraa Nope, 구문을 알아 낸 이후로 찾은 것이 아닙니다. 내가 뭔가를 실행하면 코멘트를 추가하겠습니다 :)
Shailen Naidoo

1
당신이 원하는 경우 어떻게 e.stopPropagate()click1($event)되도록 click2(event)처리 할 수 실 거예요?
Julio Motol

2
@JulioMotol click1($event)click2($event)같은 이벤트없는 2 개의 다른 이벤트에 대한 단지 2 개의 다른 기능입니다. e.stopPropagate()에 대해 아무것도하지 않습니다 click2(). 이치에
맞는

그래서 click2($event)트리거 를 멈출 방법이 없나요?
Julio Motol

11

anomymous 함수를 추가하려면 대안이 될 수 있습니다.

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

10
ES6 대안 : @click = "() => {function1 (parameters); function2 (parameters);}"
AdamJB

중요 참고 사항 : 중첩 된 함수 중 하나가 $event인수로 필요한 경우 내부에서 사용할 새 함수에 매개 변수로 전달해야합니다. 예 : ($event) => {func1($event); func2('x');}
zcoop98

9

조각으로 분리하십시오.

인라인 :

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

OR : 복합 함수를 통해 :

<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
나는 이것이 컴파일러를 깨뜨리고 렌더링하지 않을 것이라고 믿습니다. 방금 시도했습니다.
Chris Johnson

아래에서 일부에서는 작동하지만 2.6.6에서는 중단됩니다.
Chris Johnson

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

나는 또한 이것을 사용하여 여러 emits 또는 메서드를 호출하거나 둘 다 함께 분리하여 호출 할 수 있습니다. 세미콜론

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

-2

그러나 다음과 같이 할 수 있습니다.

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

예, 네이티브 onclick html 이벤트를 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.