디렉티브의 값으로는 javascript 또는 Vue 코드를 작성할 수 있지만 코드가 길어지면 가독성이 떨어지므로 일반적으로 Vue method를 호출하는 형태로 작성한다.
사용 예제 - click
<!DOCTYPEhtml><htmllang="en"><head> <metacharset="UTF-8"> <metahttp-equiv="X-UA-Compatible"content="IE=edge"> <metaname="viewport"content="width=device-width, initial-scale=1.0"> <title>Vue event</title></head><body> <divid="app"> <buttonv-on:click="testFunction">호출 방식 1</button> <buttonv-on:click="testFunction()">호출 방식 2</button> <buttonv-on:click="testFunction($event)">호출 방식 3</button> </div> <scriptsrc="https://unpkg.com/vue@next"></script> <script>constapp=Vue.createApp({ methods: {testFunction() {console.log(arguments, arguments.length);window.alert("testFunction 실행"); } } });app.mount("#app"); </script></body></html>
실행해보면 세 버튼 모두 다 동일한 결과가 나오는 것을 확인할 수 있다. 하지만 방식의 차이가 존재한다.
<buttonv-on:click="testFunction">호출 방식 1</button>
첫 번째 방식은 메소드명을 지정하여 Vue에게 실행을 위임하는 방식이다. 이 경우 이벤트 발생 정보를 Vue에서 첫 번째 매개변수로 설정해주므로 testFunction에서 선언하여 사용할 수 있다. arguments 의 0번 데이터를 살펴보면 이벤트 정보가 들어간 것을 확인할 수 있다. 하지만 이 방식의 경우 매개변수가 필요한 메소드를 실행하며 데이터를 인자로 전달할 수 없다.
<buttonv-on:click="testFunction()">호출 방식 2</button>
두 번째 방식은 메소드를 직접 실행하는 방식이다. 이 경우 이벤트 발생 정보를 직접 설정해줘야 하는데, 설정한 내용이 없기 때문에 이 방식으로 호출한 경우 메소드 내부에서는 발생한 이벤트 정보를 확인할 수 없다. 대신 데이터를 인자로 전달할 수 있다.
<buttonv-on:click="testFunction($event)">호출 방식 3</button>
세 번째 방식은 메소드를 직접 실행하며 이벤트 정보를 설정하는 방식이다. 첫 번째 방식과 두 번째 방식을 모두 해결할 수 있는 방법으로 Vue 내장 이벤트 객체인 $event를 매개변수로 전달하고, 다른 데이터들도 뒤에 작성하여 인자로 전달할 수 있다.
사용 예제 - input
input 이벤트는 입력 발생을 감지한다. v-model 연동으로도 입력에 따른 값의 변화를 관리할 수 있지만 이 부분에 대한 차이는 다음의 예제로 확인할 수 있다.