Untitled

๐Ÿ˜‰ ํ—ท๊ฐˆ๋ ธ๋˜ & ๋ชฐ๋ž๋˜ ๋ถ€๋ถ„๋“ค๋งŒ ์ •๋ฆฌํ•˜๋Š” ๋‚˜๋งŒ์˜ TIL
๐Ÿ˜ฏ ๋ชจ๋“  ๊ฐ•์˜ ๋‚ด์šฉ์€ ์ ์ง€ ์•Š์•„์š”!

์˜ค๋Š˜์˜ ์†Œ๊ฐ์€?
Vanilla JS๋กœ ๋งŒ๋“ค์—ˆ๋˜ ํ”„๋กœ์ ํŠธ๋Š” ํ•˜๋‚˜ ํ•˜๋‚˜ ๋‹ค ์„ค์ •ํ•ด์คฌ์–ด์•ผ ํ•˜๋Š”๊ฑธ
Vue๋Š” ๋ช‡๊ฐœ์˜ ์ˆ˜์‹์–ด๋งŒ์œผ๋กœ ๋ชจ๋“ ๊ฑธ ๋™์ž‘์‹œํ‚ต๋‹ˆ๋‹ค.

์‹ ๊ธฐํ•ด์š”..์ด๊ฒŒ ๋ฐ”๋กœ ๊ฑฐ๋Œ€ํ•œ ํ”„๋ž˜์ž„์›Œํฌ์˜ ์„ธ๊ณ„์ธ๊ฐ€์š”?




[1] ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง

[1-1] v-if

v-if, v-else-if, v-else ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ์ด์šฉํ•ด์„œ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

<h1 v-if="isShow1">Hello Vue</h1>
<h2 v-else-if="isShow2">Hello Vue2</h2>
<h1 v-else>Hello Vue2</h1>

์ด๋•Œ, v-else-if์— ์—ฐ๊ฒฐ๋  ์š”์†Œ๋“ค์ด ์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ์š”์†Œ๋กœ ๋ž˜ํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์š”์†Œ๊ฐ€ ๋ฐ˜์˜๋˜์ง€ ์•Š๊ธธ ์›ํ•˜๋ฉด template ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

template ํƒœ๊ทธ๋Š” ์•ˆ์˜ ์š”์†Œ๋“ค๋งŒ ์ถœ๋ ฅํ•˜๊ณ , ๋ณธ์ธ์€ ์ถœ๋ ฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

<h1 v-if="isShow1">Hello Vue</h1>
<template v-else-if="isShow2">
  <h2>Hello Vue2</h2>
  <h3>Hello</h3>
  <h4>Hello Hello</h4>
</template>
<h1 v-else>Hello Vue2</h1>


์ด๋•Œ v-if๋ฌธ์€ ์š”์†Œ๋ฅผ ์•„์˜ˆ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์š”์†Œ์˜ ๊ตฌ์กฐ ์ž์ฒด๋ฅผ ์ฃผ์„์œผ๋กœ ๋ณ€ํ™˜์‹œํ‚ต๋‹ˆ๋‹ค.

Untitled 1


[*] ํŠน์ง•

๋ฐ์ดํ„ฐ๊ฐ€ false์ธ ๊ฒฝ์šฐ, ๋ Œ๋”๋ง ์ž์ฒด๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ, ๋ Œ๋”๋ง ์ž์ฒด๊ฐ€ ๋‹ค์‹œ ์ผ์–ด๋‚˜๋ฏ€๋กœ ์ „ํ™˜ ๋น„์šฉ์ด ๋†’์Šต๋‹ˆ๋‹ค.


v-if์™€ v-for์€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด v-if๊ฐ€ ๋” ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ ธ ์›ํ•˜๋Š” ๋™์ž‘์ด ์ผ์–ด๋‚˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  • ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ์‚ฌ์šฉ๋ฒ•

<ul>
  <li v-for="user in users" v-if="user.isActive" :key="user.id">
    {{ user.name }}
  </li>
</ul>


  • ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ๋ฒ•

<ul>
  <li v-for="user in activeUsers" :key="user.id">{{ user.name }}</li>
</ul>


<ul>
  <template v-for="user in users" :key="user.id">
    <li v-if="user.isActive">{{ user.name }}</li>
  </template>
</ul>


[1-2] v-show

v-show ๋””๋ ‰ํ‹ฐ๋ธŒ๋Š” ์š”์†Œ์˜ ์Šคํƒ€์ผ ์†์„ฑ display๋ฅผ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.

<h1 v-show="isShow">Hello Vue</h1>

์š”์†Œ๊ฐ€ ์•„์˜ˆ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์š”์†Œ์˜ display ์†์„ฑ ๊ฐ’์„ none์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

Untitled 2


[*] ํŠน์ง•

๋ฐ์ดํ„ฐ๊ฐ€ false์ธ ๊ฒฝ์šฐ์—๋„ ๋ Œ๋”๋ง์€ ๋˜ ์žˆ๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ๋น„์šฉ์€ ๋†’์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์Šคํƒ€์ผ ์†์„ฑ์˜ ๊ฐ’์œผ๋กœ ๋ณด์—ฌ์ง€๋Š” ์—ฌ๋ถ€๊ฐ€ ์ •ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ „ํ™˜ ๋น„์šฉ์€ ๋‚ฎ์Šต๋‹ˆ๋‹ค.


v-show์˜ ๊ฒฝ์šฐ, ์š”์†Œ๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ์ƒ์„ฑํ•œ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…ํžˆ๊ธฐ ๋•Œ๋ฌธ์—

์ด์ค‘ ์ค‘๊ด„ํ˜ธ ํ™”๋ฉด์˜ ํ…์ŠคํŠธ๊ฐ€ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ v-cloak ๋””๋ ‰ํ‹ฐ๋ธŒ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


<h1 v-show="isShow" v-cloak>{{ msg }}</h1>
<!-- isShow, msg์˜ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋ชจ๋‘ ๋๋‚œ ํ›„์— v-cloak๋Š” ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. -->

[v-cloak] {
  display: none;
}


  • v-cloak

์ปดํฌ๋„ŒํŠธ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์š”์†Œ์— ์—ฐ๊ฒฐ์ด ๋˜์–ด ์žˆ๊ณ , ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋ชจ๋‘ ๋˜์—ˆ์œผ๋ฉด

์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋˜๋Š” ๋””๋ ‰ํ‹ฐ๋ธŒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์—ฐ๊ฒฐ๋œ ์ปดํฌ๋„ŒํŠธ ๋ฐ์ดํ„ฐ๋“ค์ด ์ปดํŒŒ์ผ์„ ์™„๋ฃŒํ•  ๋•Œ ๊นŒ์ง€ ์—˜๋ฆฌ๋จผํŠธ์— ๋‚จ์•„์žˆ์Šต๋‹ˆ๋‹ค.

ํ† ๊ธ€๋˜๋Š” ๋น„์ค‘์ด ๋†’์œผ๋ฉด v-show๋ฅผ, ํ† ๊ธ€๋˜๋Š” ๋น„์ค‘์ด ๋‚ฎ์œผ๋ฉด v-if๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.




[2] ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง

[2-1] ๋ฐฐ์—ด ์ˆœํšŒ

v-for ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

item on items ํ˜•ํƒœ์˜ ๋ฌธ๋ฒ•์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ, item ์ด์™ธ์˜ index๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค๋ฉด (item, index) on items ํ˜•ํƒœ๋กœ ์ ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ JS์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ตฌ๋ฌธ๊ณผ ๋™์ผํ•˜๊ฒŒ item of items์˜ ํ˜•ํƒœ๋กœ๋„ ์ ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


[2-2] ๊ฐ์ฒด ์ˆœํšŒ

๊ฐ์ฒด์˜ ์ˆœํšŒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ value, key์— ๋Œ€ํ•œ ์กฐํšŒ๋ฅผ ๊ฐ€๋Šฅ์ผ€ ํ•˜๊ธฐ ์œ„ํ•ด (value, key) in myObject์˜ ํ˜•ํƒœ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

key, value ์ด์™ธ์˜ index๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค๋ฉด (value, key, index) in myObject์˜ ํ˜•ํƒœ๋กœ ์ ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


[2-3] ์ƒํƒœ ์œ ์ง€

v-for์„ ์ด์šฉํ•ด์„œ ๋ Œ๋”๋ง๋œ ์—˜๋ฆฌ๋จผํŠธ ๋ชฉ๋ก์„ ๊ฐฑ์‹ ํ•  ๋•Œ, ๊ธฐ๋ณธ์ ์œผ๋กœ Vue๋Š” ๋‚˜๋ฆ„์˜ ์ตœ์ ํ™” ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค. (in-place patch)

ํ•ญ๋ชฉ์˜ ์ˆœ์„œ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ, ํ•ญ๋ชฉ์˜ ์ˆœ์„œ์™€ ์ผ์น˜ํ•˜๋„๋ก DOM ์š”์†Œ ์ž์ฒด๋ฅผ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ,

Vue๋Š” ํ•ด๋‹น ํ•ญ๋ชฉ๋“ค์„ ์ ์ ˆํ•œ ์œ„์น˜์— ํŒจ์น˜ํ•˜๊ณ  ํ•ด๋‹น ์ธ๋ฑ์Šค์—์„œ ๋ Œ๋”๋งํ•  ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.


์ด ๊ณผ์ •์—์„œ ์•ฝ๊ฐ„์˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐ ์•„์ดํ…œ์— ์œ ์ผํ•œ key ์†์„ฑ์„ ๋‘์–ด Vue์˜ ์ตœ์ ํ™” ๊ณผ์ •์— ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<div v-for="item in items" :key="item.id">...</div>


[2-4] ๋ฐฐ์—ด ๋ณ€์ด ๋ฉ”์†Œ๋“œ

Vue๋Š” ๋ฐฐ์—ด์˜ ๋ณ€์ด ๋ฉ”์†Œ๋“œ๋กœ ์ธํ•œ ๋ณ€๊ฒฝ์„ ๋ž˜ํ•‘ํ•˜์—ฌ ๋ทฐ๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


[1] ๋ณ€์ด ๋ฉ”์†Œ๋“œ

๋ณ€์ด ๋ฉ”์†Œ๋“œ๋Š” ํ˜ธ์ถœ๋œ ์›๋ž˜ ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()


[2] ๋ฐฐ์—ด ๊ต์ฒด ๋ฉ”์†Œ๋“œ (๋น„ ๋ณ€์ด ๋ฉ”์†Œ๋“œ)

๊ต์ฒด ๋ฉ”์†Œ๋“œ๋Š” ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • filter()
  • concat()
  • slice()

ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋“ค๋กœ ํ•„ํ„ฐ๋ง๋˜๊ฑฐ๋‚˜ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด computed ์†์„ฑ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

computed ์†์„ฑ์„ ์ด์šฉํ•˜์ง€ ๋ชปํ•  ์ƒํ™ฉ์—์„œ๋Š” methods์— ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


[2-5] ๋ฒ”์œ„ ์ˆœํšŒ

์ผ๋ฐ˜์ ์ธ for๋ฌธ์ฒ˜๋Ÿผ v-for๋„ ์ •์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ”์œ„๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


<p v-for="n in 10">{{ n }}</p>
<!-- ์ด ๊ฒฝ์šฐ 1๋ถ€ํ„ฐ 10๊นŒ์ง€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. -->




[3] ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง

v-on(์•ฝ์–ด: @) ๋””๋ ‰ํ‹ฐ๋ธŒ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๋‹ค๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


[3-1] ์ธ๋ผ์ธ ๋ฉ”์†Œ๋“œ ํ•ธ๋“ค๋Ÿฌ

๋•Œ๋กœ ์ธ๋ผ์ธ ๋ช…๋ น๋ฌธ ํ—จ๋“ค๋Ÿฌ์—์„œ ์›๋ณธ DOM ์ด๋ฒคํŠธ์— ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ $event๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<button @click="warn('Warnning', $event)">Submit</button>
// ...

methods: {
  warn(msg, event) { // $event๋Š” ์ด๋ฒคํŠธ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค!
    if (event) {
      event.preventDefault()
    }
    alert(msg)
  }
}


[3-2] ๋ณตํ•ฉ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ

์—ฌ๋Ÿฌ๊ฐœ์˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ์„ ๋•Œ, ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<h1 @click="a(); b(); c()">Hello Vue</h1>
<!-- Vue2 -->
<h1 @click="a(), b(), c()">Hello Vue</h1>
<!-- Vue3 -->


[3-3] ์ด๋ฒคํŠธ ์ˆ˜์‹์–ด

<!-- ํด๋ฆญ ์ด๋ฒคํŠธ ์ „ํŒŒ ์ค‘๋‹จ -->
<a @click.stop="doThis"></a>

<!-- ์ œ์ถœ ์ด๋ฒคํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. -->
<form @submit.prevent="onSubmit"></form>

<!-- ์ˆ˜์ •์ž๋Š” ์ฒด์ด๋‹์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. -->
<a @click.stop.prevent="doThat"></a>

<!-- ๋‹จ์ˆœํžˆ ์ˆ˜์‹์–ด๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. -->
<form @submit.prevent></form>

<!-- ์บก์ฒ˜ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.-->
<!--์ฆ‰, ๋‚ด๋ถ€ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์ด๋ฒคํŠธ๊ฐ€ ํ•ด๋‹น ์—˜๋ฆฌ๋จผํŠธ์—์„œ ์ฒ˜๋ฆฌ๋˜๊ธฐ ์ „์— ์—ฌ๊ธฐ์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. -->
<div @click.capture="doThis">...</div>

<!-- event.target์ด ์—˜๋ฆฌ๋จผํŠธ ์ž์ฒด์ธ ๊ฒฝ์šฐ์—๋งŒ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.-->
<!-- ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ์—์„œ๋Š” ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.-->
<div @click.self="doThat">...</div>


[1] prevent

ํ•ด๋‹น JavaScript ์ฝ”๋“œ๋ฅผ ์งง๊ฒŒ prevent ์ˆ˜์‹์–ด ํ•˜๋‚˜๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

window.addEventListener("load", () => {
  const aEL = document.querySelector("a");
  aEL.addEventListener("click", (e) => {
    e.preventDefault();
  });
});
<a href="https://google.com" target="_blank" @click.prevent>Google</a>

๋งŒ์•ฝ @์ด๋ฒคํŠธ.prevent=โ€๋ฉ”์†Œ๋“œ ์ด๋ฆ„โ€์„ ์ž…๋ ฅํ•˜๋ฉด, ๊ธฐ๋ณธ ๋™์ž‘์ด ์ œ์–ด๋˜๊ณ  ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.


[2] stop

stop ์ˆ˜์‹์–ด๋กœ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<div id="app">
  <div class="parent" @click="log">
    <div class="child" @click.stop="log"></div>
    <!-- ์ƒ์œ„ ์š”์†Œ๋กœ์˜ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. -->
  </div>
</div>


[3] capture

์ด๋ฒคํŠธ ์บก์ณ๋ง์„ capture ์ˆ˜์‹์–ด๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

window.addEventListener(
  "click",
  () => {
    console.log("window");
  },
  { capture: true }
);
<div class="parent" @click.capture="log">
  <!-- ์ด๋ฒคํŠธ ์บก์ณ -->
  <div class="child" @click.stop="log"></div>
</div>


[4] self

์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ, ์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ currentTarget๊ณผ target์€ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

target์€ ํ˜„์žฌ ํด๋ฆญํ•œ ๋ถ€๋ถ„์„ ๋งํ•˜๋ฉฐ currentTarget์€ ์ด๋ฒคํŠธ๊ฐ€ ์—ฐ๊ฒฐ์ด ๋˜์–ด์žˆ๋Š” ๋ถ€๋ถ„์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

self ์ˆ˜์‹์–ด๋Š” currentTarget๊ณผ target์ด ๊ฐ™์€ ์š”์†Œ์ผ๋•Œ๋งŒ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

<div class="parent" @click.self="log">
  <div class="child"></div>
</div>


[5] passive

passive ์ˆ˜์‹์–ด๋Š” ํ™”๋ฉด์˜ ์›€์ง์ž„๊ณผ ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์˜ ์ฒ˜๋ฆฌ๋ฅผ ๋ถ„๋ฆฌ์‹œํ‚ต๋‹ˆ๋‹ค.

window.addEventListener(
  "click",
  () => {
    console.log("window");
  },
  { passive: true }
);

<div class="parent" @wheel.passive="log">
  <div v-for="n in 15" class="child">{{ n }}</div>
</div>


[3-4] ํ‚ค ์ˆ˜์‹์–ด

ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ์—์„œ ํ‚ค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•  ๋•Œ, ํ‚ค ์ˆ˜์‹์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‚ค๋ณด๋“œ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ‚ค์˜ ์ด๋ฆ„์„ ์ผ€๋ฐฅ ์ผ€์ด์Šค๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ˆ˜์‹์–ด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<input @keyup.page-down="onPageDown" /> <input @keyup.arrow-down="log" />

ํ‚ค ์ˆ˜์‹์–ด๋Š” ์ฒด์ด๋‹ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<input @keyup.alt.enter="clear" />
<!-- ์•ŒํŠธ์™€ ์—”ํ„ฐ๋ฅผ ๋™์‹œ์— ํด๋ฆญ ์‹œ ์ด๋ฒคํŠธ -->


๊ธฐ๋ณธ์ ์œผ๋กœ ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ๋Š” ๋™์‹œ์— ๋ˆ„๋ฅธ ํ‚ค๋“ค ์ค‘์— ํ•ด๋‹น ํ‚ค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€๋งŒ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ํ‚ค๋งŒ ๋ˆŒ๋ ธ๋Š”์ง€ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” exact๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<input @keyup.arrow-down.exact="log" />
<!-- ํ‚ค๋ณด๋“œ ์•„๋ž˜ ํ‚ค๋งŒ ๋ˆŒ๋ €์„ ๋•Œ ์ด๋ฒคํŠธ๊ฐ€ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. -->




[4] ํผ ์ž…๋ ฅ ๋ฐ”์ธ๋”ฉ

v-model ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ: ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ์ชฝ์œผ๋กœ ์ „๋‹ฌ
  • ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ: ๋ฐ์ดํ„ฐ๊ฐ€ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉ


๋‹จ v-model์€ ํ•œ๊ธ€์— ๋Œ€ํ•ด์„œ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Untitled 3

ํ•œ ๊ธ€์ž๊ฐ€ ์™„์„ฑ์ด ๋˜์–ด์•ผ๋งŒ ๋ฐ˜์˜์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ด๋Ÿด๋•, :value์™€ @input ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<input :value="msg" @input="msg = $event.target.value" />

Untitled 4


[4-1] ์ˆ˜์‹์–ด

[1] lazy

v-model์€ ๊ฐ ์ด๋ฒคํŠธ ํ›„ ์ž…๋ ฅ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

lazy ์ˆ˜์‹์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ change ์ด๋ฒคํŠธ ์ดํ›„์— ๋™๊ธฐํ™”๊ฐ€ ๋˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<input v-model.lazy="msg" />


[2] number

์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ž๋™์œผ๋กœ ์ˆซ์ž๋กœ ํ˜•๋ณ€ํ™˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<input v-model.number="msg" />


[3] trim

์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋‚ด์šฉ์—์„œ ์ž๋™์œผ๋กœ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•ด์ค๋‹ˆ๋‹ค.

<input v-model.trim="msg" />





์ถœ์ฒ˜

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

Vue.js3 Document

์นดํ…Œ๊ณ ๋ฆฌ: ,

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ