@로 대체가 가능하다.
- 메소드 이벤트 핸들러 :
@click="greet"
- 인라인 메소드 핸들러 :
@click="say('hi')
- 복합 이벤트 핸들러 :
@click="one($event), two($event)"
$event
를 지정하면 event로 전달 해 줄 수있다..stop => event.stopPropagation
.prevent => event.preventDefault
.capture
.self
.once
.passive
사용법
@click
뒤에 붙여서 쓴다.
기본적으로는 버블링 형태고 진행한다.
<div id="app">
<div class="parent" @click="log">
<div class="child" @click="log"></div>
</div>
</div>
</body>
<script>
const App = {
data(){
return {
msg : 'Vue!'
}
},
methods:{
log(event){
console.log(event.currentTarget)
}
}
}
const vm = Vue.createApp(App).mount('#app')
</script>
child를 클릭할 경우 이벤트 버블링에 의해 child태그의 log함수와 parent태그의 log함수가 차례로 실행된다.
child -> parent
해당 부분을 각각
@click.capture
로 바꾼다면
캡쳐링을 통해 진행되어 parent태그의 log함수와 child태그의 log함수가 차례로 시행된다.
parent -> child
parent를
@click.capture
로 하고
child를@click.stop
로 하면
child부분을 클릭했을때 capture로 parent가 먼저 반응하고 그아래 child가 반응하면서 버블링 되지않고 멈춘다
@click.prevent 사용
@click.once를 이용해서 1번만 진행시킨다.
ex)
<a href="https://google.com"
target="_blank"
@click.once.prevent="log">Google</a>
해당 태그의 경우 prevent가 진행되는 것과 log함수가 실행되는것이 1번만 진행되고 그외에는 default에 함수 실행을 하지않는다.
<div id="app">
<div class="parent"
@click.stop="log">
<div class="child"></div>
</div>
</div>
</body>
<script>
const App = {
data(){
return {
msg : 'Vue!'
}
},
methods:{
log(event){
console.log(event.currentTarget,event.target)
}
}
}
const vm = Vue.createApp(App).mount('#app')
</script>
- event.currentTarget : 이벤트 핸들러가 등록된 태그 대상
- event.target : 실제 클릭이 적용된 태그 대상
현재 상황에서 child를 클릭하면 버블링에 의해 click이벤트가 부모인 parent에서 발생하므로 원하는 목표인 파란 부모부분에서만 작동 시키기 위해서는 @click.self
로 바꾼다.
.self
의 기능은 currentTarget과 target이 같을때만 동작시키게 하는 역할을 지닌다.
Enter -> .enter
ArrowDown -> .arrow-down
Alt -> .alt
-
로 구분하였다. ex)
<input @keyup.arrow-down="log"/>
input 태그에서 ArrowDown을 눌러야 log함수가 동작한다.
ex)
<input @keyup.arrow-down.enter="log"/>
arrow-down이나 enter일때 log함수가 실행
다른 시스템 수식어와 조합해 그 핸들러가 실행되기 위해 정확한 조합이 눌러야하는 것을 요구
<!-- 아래코드는 Alt 또는 Shift와 함께 눌렀을 때도 실행됩니다.-->
<button @click.ctrl="onClick">A</button>
<!-- 아래코드는 Cntl키만 눌려져 있을 때 실행됩니다.-->
<button @click.ctrl.exact="onCtrlClick">A</button>
<!-- 아래 코드는 시스템 키가 눌리지 않은 상태인 경우에만 작동합니다.-->
<button @click.exact="onClick">A</button>
exact의 대상은
.alt .enter .ctrl
등 과 같은 키수식어이다. 만약 키수식어가 아니라 알파벳 같은거랑 같이 눌러도 동작은 한다.
HTML 템플릿을 간단히 하여 JavaScript 코드 내에서 핸들러 함수 구현을 찾는 것이 더 쉽습니다. =>SFC와 관련
JavaScript에서 이벤트 리스너를 수동으로 연결할 필요가 없으므로 ViewModel 코드는 순수 로직과 DOM이 필요하지 않습니다. 이렇게 하면 테스트가 쉬워집니다. => document.querySelector 이런것으로 연결할 필요가 없다.
ViewModel이 파기되면 모든 이벤트 리스너가 자동으로 제거 됩니다. 이벤트 제거에 대한 걱정이 필요없어집니다.