이벤트 핸들링 (Event Handling)
# 이벤트 리스닝
v-on 디렉티브는 단축 문법으로 @ 기호를 사용, DOM 이벤트를 수신하고 트리거될 때, 사전 정의된 코드를 실행.
주요 문법은, v-on:click="handler" ( = @click="handler")
# 인라인 핸들러 (Inline Handlers)
<script>
export default{
data() {
return {
count: 0
}
}
}
</script>
<template>
<h2>인라인 핸들러</h2>
<button @click="count++">1추가</button>
<p>숫자 값: {{ count }}</p>
</template>
# 메서드 핸들러 (Method Handlers)
<script>
export default{
methods: {
greet(event) {
// `this`는 메서드가 활성화된 현재 인스턴스
alert(`안녕 ${this.name}!`)
// 'event'는 네이티브 DOM 이벤트 객체입니다.
if (event) {
alert(event.target.tagName)
}
}
}
}
</script>
<template>
<h2>메서드 핸들러</h2>
<button @click="greet">환영하기</button>
</template>
# 인라인 핸들러에서 메서드 호출
메서드 이름을 직접 바인딩하는 대신, 인라인 핸들러에서 메서드를 호출 가능.
(사용자 지정 인자를 메서드에 전달)
<script>
export default{
say(message) {
alert(message)
}
}
</script>
<template>
<h2>인라인 핸들러에서 메서드 호출하기</h2>
<button @click="say('안녕')">안녕이라고 말하기</button>
<button @click="say('잘가')">잘가라고 말하기</button>
</template>
# 인라인 핸들러에서 이벤트 객체 접근
인라인 핸들러에서 네이티브 DOM 이벤트 객체에 접근 시, $event를 사용하여 메서드에 전달하거나 인라인 화살표 함수 사용.
const name = ref('Vue.js')
function greet(event) {
alert(`Hello ${name.value}!`)
// `event` is the native DOM event
if (event) {
alert(event.target.tagName)
}
}
<h2>인라인 핸들러에서 이벤트 객체 접근하기</h2>
<!-- 특수한 키워드인 $event 사용 -->
<button @click="warn('아직 양식을 제출할 수 없습니다.', $event)">
제출하기
</button>
<!-- 인라인 화살표 함수 사용 -->
<button @click="(event) => warn('아직 양식을 제출할 수 없습니다.', event)">
제출하기
</button>
# 이벤트 수식어
이벤트 핸들러에서 event.preventDefault() 또는 event.stopPropagation()은 흔히 사용하며,
메서드에서 이 작업을 쉽게할 수 있지만, 메서드가 DOM 이벤트에 대한 세부적인 처리 없이, 데이터 처리 로직만 있다면
코드 유지보수에 더 좋을 것입니다.
이 문제를 해결하기 위해 v-on은 점(.)으로 시작하는 지시적 접미사인 이벤트 수식어를 제공합니다.
- .stop
- .prevent
- .self
- .capture
- .once
- .passive
<!-- click 이벤트가 부모에게 전파x (버블링x) -->
<a @click.stop="doThis" href="https://www.naver.com/" target="_blank">doThis</a>
<!-- submit 이벤트가 더 이상 페이지 리로드 x -->
<form @submit.prevent="onSubmit" action="https://www.naver.com/">
<button>제출</button>
</form>
<!-- 수식어 연결 가능 -->
<a @click.stop.prevent="doThat" href="https://www.naver.com/" target="_blank">doThat</a>
<!-- 이벤트 핸들러 없이 수식어만 사용 가능 -->
<form @submit.prevent action="https://www.naver.com/">
<button>제출</button>
</form>
<!-- event.target이 엘리먼트 자신일 경우에만 핸들러가 실행됩니다. -->
<!-- 예를 들어 자식 엘리먼트에서 클릭 액션이 있으면 핸들러가 실행되지 않습니다. -->
<div @click="boxClick" class="box">
<span @click="spanClick" class="box">click</span>
</div>
<!-- boxClick, spanClick 모두 실행 -->
<div @click.self="boxClick" class="box">
<span @click.self="spanClick" class="box">click</span>
<!-- spanClick만 실행 -->
</div>
# event.preventDefault() 와 event.stopPropagation() 의 차이
event.preventDefault()
event.preventDefault() 메서드는 그 요소의 이벤트의 기본 동작 중지. → 상위 요소들로 이벤트 전달
일반적으로 링크 클릭, 폼 제출, 키보드 입력 등과 같은 HTML 요소의 기본 동작을 막기 위해 사용.
event.stopPropagation():
event.stopPropagation() 메서드는 이벤트의 버블링(bubbling) 단계를 중지시키는 데 사용. → 상위 요소들로의 이벤트 중단
(버블링은 이벤트가 DOM 요소에서 상위 요소로 전파되는 것)
참고 코드펜 : https://codepen.io/lhxiifbi-the-scripter/pen/PoVqzoV
'Vue.js' 카테고리의 다른 글
[Vue.js] Vue Form 입력 바인딩(Form Input Bindings) (4) | 2023.10.26 |
---|---|
[Vue.js] Vue 리스트 렌더링 (List Rendering) (1) | 2023.10.26 |
[Vue.js] Vue 조건부 렌더링 (Conditional Rendering) (0) | 2023.10.26 |
[Vue.js] Vue 클래스와 스타일 바인딩 (Class and Style Bindings) (1) | 2023.10.26 |
[Vue.js] Vue 계산된 속성 (Computed Properties) (0) | 2023.10.26 |