๐ŸŽจFrontEnd/Vue

vue 3 - ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง

IOTrue 2023. 7. 16. 18:48

๐Ÿ˜Ž vue 3 - ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง

composition API๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค

โœ…  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง

v-on ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹จ์ถ•ํ•ด์„œ @ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
v-on:click="handler" ๋˜๋Š” ์ค„์—ฌ์„œ @click="handler"์™€ ๊ฐ™์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

์‚ฌ์šฉ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

  1. ์ธ๋ผ์ธ ํ•ธ๋“ค๋Ÿฌ: ์ด๋ฒคํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ธ๋ผ์ธ JavaScript
  2. ๋ฉ”์„œ๋“œ ํ•ธ๋“ค๋Ÿฌ: ์ปดํฌ๋„ŒํŠธ์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ
<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 ๊ฐ์ฒด๋ฅผ ๋™์ผํ•˜๊ฒŒ ๋ถˆ๋Ÿฌ์˜จ๋‹ค

$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