🌲 click 이벤트
인수가 없을 때 아래와 같이 사용되지만 이는 인수가 생략된 형태로 vue에서 지원하는 문법이다.
<button @click="handler">
click!!
</button>
인수를 직접 넣으면 작동한다.
<button @click="handler('Hello')">
click!
</button>
🌲메소드 이벤트 핸들링
로직을 @click에 바로 넣는 것이 아니라 메소드를 만들어 핸들링하는 것이 많은 양의 데이터를 처리하기에 용이하다.
🌳inline method handler
handler에 들어가는 인수(여기서는 event)는 클릭 이벤트가 발생했을 때 정보를 갖는 객체(mouse event)로 이곳에서 필요한 속성을 가져와 사용할 수 있다. 이 인수는 매개변수이기 때문에 다른 이름으로 변경이 가능하다.
<button @click="handler">
click!!
</button>
methods: {
handler(event) {
console.log(event)
console.log(event.target) // <button>click!!</button>
console.log(event.target.textContent) // click!!
}
}
🌳인라인 + 이벤트
인라인 이벤트 핸들러(인수사용)에 이벤트 핸들러를 함께 사용하는 방법
$를 붙인다.
<button @click="handler('hello', $event)">
click!!
</button>
🌳Multiple event handlers
다중 메소드 핸들러를 사용할 때는 인수가 없어도 호출하겠다는 의미로 소괄호()를 명시해야 한다.
<button @click="handlerA(), handlerB()">
click!!
</button>
methods: {
handlerA(){로직},
handlerB(){로직}
}
🌲Event Modifiers
이벤트 수식어
<a
href="https://www.naver.com"
target="_blank"
@click="handler">
Naver</a>
methods: {
handler() {
console.log('N')
}
}
🌳prevent
HTML의 기본 동작을 방지하고 method만 실행하는 기능이다.
(Naver를 클릭했을 때 새창은 열리지 않으나 콘솔창에 N은 출력된다.)
mouseevent에서 사용할 수 있는 메소드
handler(e) {
e.preventDefault()
}
vuejs 문법
@click.prevent="handler"
🌳once
(HTML은 동작하나) method를 한 번만 실행
(Naver는 클릭할 때마다 새 창이 나타나고 콘솔창에 N은 한 번만 출력된다.)
이벤트 수식어 체이닝
체이닝으로 사용 가능하며 html도 method도 한 번씩만 실행되는 결과를 출력한다.
@click.prevent.once="handler"
🌲이벤트 버블링, 캡쳐링
<div class="parent" @click="handlerA">
<div class="child" @click="handlerB">
</div>
</div>
🌳버블링
child를 포함하고 있는 상위의 영역에 영향을 주는 현상
=> child를 클릭했을 때, child->parent 순으로 클릭된다.
버블링을 방지하기 위하여 Vuejs에서는 stop이라는 수식어를 사용하며 이는 stopPropagation메소드와 동일한 기능을 한다.
handlerB(e) {
e.stopPropagation()
}
@click.stop="handlerB"
=> child를 클릭해도 parent는 동작하지 않는다
🌳캡쳐링
버블링과 반대의 기능을 의도할 때 capture수식어를 이용한다. 상위 요소가 먼저 동작하고 하위 요소로 내려온다.
=> child를 클릭했을 때, parent->child 순으로 클릭된다.
@click.capture="handlerA"
캡쳐링 시 부모 요소에만 동작하려면?
@click.capture.stop="handlerA"
🌳self
target과 currenttarget이 동일할 때에만 동작되는 이벤트 수식어이다.
기본적으로 parent에만 클릭 이벤트가 있을 때, child를 선택하면 parent를 선택한 것과 동일하게 기능하는데 이를 방지할 때 사용한다.
@click.self="handlerA"
🌳passive
wheel이벤트가 동작할 때, 실제 화면에서 스크롤되는 것과 로직 처리를 독립시켜 화면에 부하가 되는 것을 막는다.
@wheel.passive="handler"
키 수식어
keydown
<input
type="text"
@keydown="handler" />
methods: {
handler(e) {
if(e.key === 'Enter'){
console.log('Enter')
}
}
}
(마우스이벤트의 key속성이 Enter일 때 콘솔에 Enter를 출력하라.)
클릭이벤트가 갖고 있는 객체데이터에는 key속성이 있는데 input입력창에서 키보드를 누를 때마다 key속성값은 변화한다. 키보드에서 Enter키를 누르게 되면 key속성 역시 Enter로 변하는데 이것을 이용해 로직을 실행시키고자 하는 if문이다.
위 코드를 vuejs속성으로 간단히 표현할 수 있다. 이때 Enter는 케밥케이스(대쉬)로 명시해야 한다.
<input
type="text"
@keydown.enter="handler" />
keydown은 체이닝 형식으로도 사용가능하다. ctrl+a조합을 만들 때는 다음과 같이 사용한다.
<input
type="text"
@keydown.ctrl.a="handler" />
'FE' 카테고리의 다른 글
Vue.js Components와 Props, slot, provide, inject (0) | 2021.12.22 |
---|---|
Vue.js 폼 입력 바인딩 / 단방향, 양방향 / v-model (0) | 2021.12.21 |
Vue.js 인스턴스와 라이프사이클 훅 (0) | 2021.12.20 |
Vue.js 반복문 리스트 렌더링 (0) | 2021.12.11 |
Vue.js 조건부 렌더링 v-if, v-show (0) | 2021.12.11 |