vue 3 - ์ด๋ฒคํธ ํธ๋ค๋ง
๐ vue 3 - ์ด๋ฒคํธ ํธ๋ค๋ง
composition API๋ฅผ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค
โ ์ด๋ฒคํธ ํธ๋ค๋ง
v-on ๋๋ ํฐ๋ธ๋ฅผ ํตํด ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๋จ์ถํด์ @ ๊ธฐํธ๋ฅผ ์ฌ์ฉํ๋ค
v-on:click="handler" ๋๋ ์ค์ฌ์ @click="handler"์ ๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค
์ฌ์ฉ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค
- ์ธ๋ผ์ธ ํธ๋ค๋ฌ: ์ด๋ฒคํธ๊ฐ ํธ๋ฆฌ๊ฑฐ๋ ๋ ์คํ๋๋ ์ธ๋ผ์ธ JavaScript
- ๋ฉ์๋ ํธ๋ค๋ฌ: ์ปดํฌ๋ํธ์ ์ ์๋ ๋ฉ์๋
<p>์ซ์ ๊ฐ์: {{ count }}</p>
// ์ธ๋ผ์ธ
<button @click="count++">1 ์ถ๊ฐ</button>
// ๋ฉ์๋
<button @click="countIncrement">1 ์ถ๊ฐ</button>
const count = ref(0)
const countIncrement = () => {
count.value++
}
โ ์ด๋ฒคํธ ๊ฐ์ฒด ์ ๊ทผ
ํน์ ํค์๋ $event๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์๋์ ์ ๋ฌํ๊ฑฐ๋ ์ธ๋ผ์ธ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค
<!-- $event ์ฌ์ฉ -->
<button @click="warn('Event vue $event', $event)">
์ ์ถํ๊ธฐ
</button>
<!-- ์ธ๋ผ์ธ ํ์ดํ ํจ์ ์ฌ์ฉ -->
<button @click="event => warn('Event vue event', event)">
์ ์ถํ๊ธฐ
</button>
<!-- ๋ฉ์๋ ๋ฐฉ์ -->
<button @click="checkEventTarget">checkEventTarget</button>
const warn=(message, event) => {
// ๋ค์ดํฐ๋ธ ์ด๋ฒคํธ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๋ค
if (event) {
event.preventDefault()
}
console.log(`message~! : ${message}, / ์ด๋ฒคํธ ๊ฐ์ฒด : ${event.target}`)
}
const checkEventTarget = (event) => {
console.log(event.target)
}
์๋์ ๊ฒฐ๊ณผ์ฒ๋ผ event ๊ฐ์ฒด๋ฅผ ๋์ผํ๊ฒ ๋ถ๋ฌ์จ๋ค
๐ก $ ์ ๋์ฌ
์ฌ์ฉ์์๊ฒ ๋ ธ์ถ๋๋ vue์ ๋ด์ฅ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ฉฐ ํต์ฌ API์ ์ฌ์ฉํ๋ค
$ ์์ฑ์ด ํ์ฌ ๊ตฌ์ฑ ์์๊ฐ ์๋ ๋ค๋ฅธ ์์น์ ์ ์๋์ด ์์์ ํ์ํ๋ ์ญํ ์ ํ๋ค
์ฆ, $ ์ ๋์ฌ๋ vue์ ์ ์ญ ์์ฑ์ ์๋ฏธํ๋ค
โ ์ด๋ฒคํธ ์์์ด
์ (.)์ผ๋ก ์์ํ๋ ์ง์์ ์ ๋ฏธ์ฌ์ธ ์ด๋ฒคํธ ์์์ด๋ฅผ ์ ๊ณตํ๋ค
- .stop
- .prevent
- .self
- .capture
- .once
- .passive
์๋ ์์ ์ฒ๋ผ ๋ค์ํ ํ์ฉ์ด ๊ฐ๋ฅํ๋ค
<!-- submit ์ด๋ฒคํธ๊ฐ ๋ ์ด์ ํ์ด์ง๋ฅผ ๋ฆฌ๋ก๋ํ์ง ์๋๋ค -->
<form @submit.prevent="onSubmit">onSubmit</form>
<!-- ํด๋ฆญ ์ด๋ฒคํธ ์ ํ๊ฐ ์ค์ง๋๋ค -->
<a @click.stop="doThis">aํ๊ทธ</a>
<div>
์ด๋ฒคํธ ์ ํ stop
<div @click="onClick">1๋ฒ div
<div @click.stop="eventStop">2๋ฒ div eventStop
<div @click="innerClick">3๋ฒ div inner</div>
</div>
</div>
</div>
const onClick=(e)=>{
console.log("onClick", e.target)
}
const eventStop=(e)=>{
console.log('event stop', e.target)
}
const innerClick(e)=>{
console.log('event stop', e.target)
}
<!-- ์์์ด ์ฐ๊ฒฐ ๊ฐ๋ฅ (์ฒด์ด๋) -->
<a @click.stop.prevent="doThat"></a>
<!-- ์ด๋ฒคํธ์ ํธ๋ค๋ฌ ์์ด ์์์ด๋ง ์ฌ์ฉํ ์ ์๋ค -->
<form @submit.prevent></form>
<!-- event.target์ด ์๋ฆฌ๋จผํธ ์์ ์ผ ๊ฒฝ์ฐ์๋ง ํธ๋ค๋ฌ๊ฐ ์คํ๋๋ค -->
<!-- li์์์ ํด๋ฆญ ์ก์
ํธ๋ค๋ฌ๋ ์คํ๋์ง ์๋๋ค -->
<ul @click.self="doThat">
<li>li 1</li>
<li>li 2</li>
<li>li 3</li>
</ul>
// ์์ ์๋ฅผ ์ฌ์ฉํ ๋๋ ๊ด๋ จ ์ฝ๋๊ฐ ๋์ผํ ์์๋ก ์์ฑ๋๋ฏ๋ก ์์๊ฐ ์ค์ํ๋ค
// @click.prevent.self = ์จ๋ฆฌ๋จผํธ ์์ฒด์ ์์์ ๋ํ ํด๋ฆญ์ ๊ธฐ๋ณธ ๋์์ ๋ฐฉ์ง
// @click.self.prevent = ์จ๋ฆฌ๋จผํธ ์์ฒด์ ๋ํ ํด๋ฆญ์ ๊ธฐ๋ณธ ๋์๋ง ๋ฐฉ์ง
<!-- ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ถ๊ฐํ ๋ ์บก์ฒ ๋ชจ๋ ์ฌ์ฉ -->
<!-- ๋ด๋ถ ์๋ฆฌ๋จผํธ์์ ํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์คํ๋๊ธฐ ์ ์, ์ฌ๊ธฐ์์ ๋จผ์ ํธ๋ค๋ฌ๊ฐ ์คํ -->
<div @click.capture="doThis">...</div>
<div>ulClick</div>
<ul @click.capture="ulClick">
<li @click="liClick">1</li>
<li @click="liClick">2</li>
</ul>
const ulClick=(e)=>{
console.log('ul click', e.target.tagName, e.target.innerHTML)
}
const liClick=(e)=>{
console.log('li click ~ ', e.target.tagName, e.target.innerHTML)
}
<!-- ํด๋ฆญ ์ด๋ฒคํธ๋ ๋จ ํ ๋ฒ๋ง ์คํ๋๋ค -->
<a @click.once="doThis"></a>
<!-- ํธ๋ค๋ฌ ๋ด `event.preventDefault()`๊ฐ ํฌํจ๋์๋๋ผ๋ -->
<!-- ์คํฌ๋กค ์ด๋ฒคํธ์ ๊ธฐ๋ณธ ๋์(์คํฌ๋กค)์ด ๋ฐ์ -->
// .passive ์์์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ฐ์ผ ์ฅ์น์ ์ฑ๋ฅ ํฅ์์ ์ํด ํฐ์น ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ํจ๊ป ์ฌ์ฉ
<div @scroll.passive="onScroll">...</div>
//.passive๋ ๋ธ๋ผ์ฐ์ ์๊ฒ ์ด๋ฒคํธ์ _๊ธฐ๋ณธ ๋์์ ๋ฐฉ์ง(prevent)ํ์ง ์๊ฒ ๋ค_๋ ์๋๋ฅผ ์ ๋ฌํ ๊ฒ์
๋๋ค.
// ๋ฐ๋ผ์ .passive์ .prevent๋ฅผ ํจ๊ป ์ฌ์ฉํด์๋ ์๋๋ฉฐ
// ๊ทธ๋ ๊ฒ ํ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ (์ฝ์)์์ ๊ฒฝ๊ณ ๋ฉ์ธ์ง๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
โ ์ ๋ ฅํค ์์์ด
@keyup, keydown, keypress๋ฅผ ํตํด ์ฌ์ฉํ๋ค
<!-- `key`๊ฐ `Enter`์ผ ๋๋ง `submit`์ ํธ์ถ -->
<input @keyup.enter="submit" />
<input @keydown.tab="submit" />
<input @keypress.enter="submit" />
Vue๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ํค์ ๋ํ ๋ณ์นญ์ ์ ๊ณตํ๋ค
- .enter
- .tab
- .delete ("Delete" ๋ฐ "Backspace" ํค ๋ชจ๋ ์บก์ฒ)
- .esc
- .space
- .up
- .down
- .left
- .right
์์คํ ์ ๋ ฅํค ์์์ด
- .ctrl
- .alt
- .shift
- .meta ์ปค๋ฉ๋ ํค(โ) or Windows ํค(โ)
exact
.exact ์์์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฐ ํ์ํ ์์คํ ์์์ด์ ์ ํํ ์กฐํฉ์ ์ ์ดํ ์ ์๋ค
<div>alt์ ํจ๊ป ๋ค๋ฅธ ์์คํ
์
๋ ฅํค๋ฅผ ๋๋ฅธ ์ํ์์๋ ํด๋ฆญํ๋ฉด ์คํ๋๋ค</div>
<button @click.alt="onClick">A</button>
<div>์ค์ง alt๋ง ๋๋ฅธ ์ํ์์ ํด๋ฆญํด์ผ ์คํ๋๋ค</div>
<button @click.alt.exact="onAltClick">A</button>
<div>์์คํ
์
๋ ฅํค๋ฅผ ๋๋ฅด์ง ์๊ณ ํด๋ฆญํ ๋๋ง ์คํ๋๋ค</div>
<button @click.exact="onClick2">A</button>
https://v3-docs.vuejs-korea.org/guide/essentials/event-handling.html
์ด๋ฒคํธ ํธ๋ค๋ง | Vue.js
v3-docs.vuejs-korea.org