Template

뷰의 ν…œν”Œλ¦Ώμ€ HTML, CSS λ“±μ˜ λ§ˆν¬μ—… 속성과 λ·° μΈμŠ€ν„΄μŠ€μ—μ„œ μ •μ˜ν•œ 데이터 및 λ‘œμ§μ„ μ—°κ²°ν•˜μ—¬ μ‚¬μš©μžκ°€ λΈŒλΌμš°μ €μ—μ„œ λ³Ό 수 μžˆλŠ” ν˜•νƒœμ˜ HTML둜 λ³€ν™˜ν•΄μ£ΌλŠ” 속성이닀.

  • ES5μ—μ„œ λ·° μΈμŠ€ν„΄μŠ€μ˜ template 속성 ν™œμš©

  • μ‹±κΈ€ 파일 μ»΄ν¬λ„ŒνŠΈ μ²΄κ³„μ˜ <template> μ½”λ“œ ν™œμš©

ν…œν”Œλ¦Ώ 속성은 λ‹€μŒκ³Ό 같이 두가지 λ°©λ²•μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

1. ES5μ—μ„œ λ·° μΈμŠ€ν„΄μŠ€μ˜ template 속성 ν™œμš©

new Vue({
  template: '<p>Hello {{message}}</p>'
});

이전 μ˜ˆμ œμ—μ„œ 주둜 μ‚¬μš©ν•œ μœ„μ™€ 같은 μ½”λ“œμ΄λ‹€.

ν…œν”Œλ¦Ώμ€ μ‚¬μš©μžκ°€ λ³Ό μˆ˜λŠ” μ—†μ§€λ§Œ 라이브러리 λ‚΄λΆ€μ μœΌλ‘œ template μ†μ„±μ—μ„œ μ •μ˜ν•œ λ§ˆν¬μ—… + λ·° 데이터λ₯Ό 가상 돔 기반의 render() ν•¨μˆ˜λ‘œ λ³€ν™˜ν•œλ‹€. λ³€ν™˜λœ render() ν•¨μˆ˜λŠ” μ΅œμ’…μ μœΌλ‘œ μ‚¬μš©μžκ°€ λ³Ό 수 있게 화면을 κ·Έλ¦¬λŠ” 역할을 ν•œλ‹€.

  • template 속성을 μ‚¬μš©ν•˜μ§€ μ•Šμ€ 경우

<div id="app">
  <h3>{{message}}</h3>
</div>
<script>
  new Vue({
    el: '#app',
    data: {
      message: 'Hello'
    }
  });
</script>

template 속성을 μ‚¬μš©ν•˜μ§€ μ•Šμ€ κ²½μš°μ—λŠ” μš°μ„  <h3>{{message}}</h3> μ½”λ“œλ₯Ό 화면에 ν‘œμ‹œν•˜κ³ , μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜λ©΄ message의 값을 data속성 μ•ˆμ˜ κ°’μœΌλ‘œ μΉ˜ν™˜ν•œλ‹€.

  • template 속성을 μ‚¬μš©ν•œ 경우

template속성을 μ‚¬μš©ν•˜λ©΄ 아무 λ‚΄μš©μ΄ μ—†λ‹€κ°€ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜λ©΄ <h3>{{message}}</h3> μ½”λ“œκ°€ 화면에 μΆ”κ°€λ˜μ–΄ ν‘œμ‹œλœλ‹€.

2. μ‹±κΈ€ 파일 μ»΄ν¬λ„ŒνŠΈ μ²΄κ³„μ˜ <template> μ½”λ“œ ν™œμš©

데이터 바인딩

데이터 바인딩은 HTML ν™”λ©΄ μš”μ†Œλ₯Ό λ·° μΈμŠ€ν„΄μŠ€μ˜ 데이터와 μ—°κ²°ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.

{{}}

λ·° μΈμŠ€ν„΄μŠ€μ˜ 데이터λ₯Ό HTML νƒœκ·Έμ— μ—°κ²°ν•˜λŠ” κ°€μž₯ 기본적인 ν…μŠ€νŠΈ μ‚½μž… 방식이닀.

data μ†μ„±μ˜ message 값을 {{message}}에 μ—°κ²°ν•˜μ—¬ 화면에 λ‚˜νƒ€λ‚΄λŠ” μ½”λ“œμ΄λ‹€. μ—¬κΈ°μ„œ data μ†μ„±μ˜ message 값이 λ³€κ²½λ˜λ©΄ λ·° λ°˜μ‘μ„±μ— μ˜ν•΄ 화면이 μžλ™μœΌλ‘œ κ°±μ‹ λœλ‹€.

λ§Œμ•½μ— λ·° 데이터가 λ³€κ²½λ˜μ–΄λ„ 값을 λ°”κΎΈκ³  μ‹Άμ§€ μ•Šλ‹€λ©΄ v-once 속성을 μ‚¬μš©ν•˜λ©΄λœλ‹€.

v-bind

v-bindλŠ” id, class, style λ“±μ˜ HTML 속성 값에 λ·° 데이터 값을 μ—°κ²°ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 데이터 μ—°κ²° 방식이닀.

λ‹€μŒκ³Ό 같이 v-bind μ†μ„±μœΌλ‘œ μ§€μ •ν•  HTML μ†μ„±μ΄λ‚˜ props μ†μ„±μ•žμ— μ ‘λ‘μ‚¬λ‘œ λΆ™μ—¬μ£Όλ©΄λœλ‹€.

μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ λ°μ΄ν„°μ˜ 값이 각 <p> 에 μ—°κ²°λ˜μ–΄ 화면에 λ‚˜νƒ€λ‚œλ‹€.

μ—¬κΈ°μ„œ v-bind: 문법을 : 둜 κ°„μ†Œν™”ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ v-bind:idλŠ” :id와 같은 λ™μž‘μ„ ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ ν‘œν˜„μ‹

뷰의 ν…œν”Œλ¦Ώμ—μ„œλ„ μžλ°”μŠ€ν¬λ¦½νŠΈ ν‘œν˜„μ‹μ„ μ“Έ 수 μžˆλ‹€. {{}} μ•ˆμ— μžλ°”μŠ€ν¬λ¦½νŠΈ ν‘œν˜„μ‹μ„ λ„£μœΌλ©΄ λœλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•  λ•Œ μ£Όμ˜ν•΄μ•Όν•  점이 μžˆλ‹€.

  1. μžλ°”μŠ€ν¬λ¦½νŠΈ μ„ μ–Έλ¬Έκ³Ό λΆ„κΈ° ꡬ문은 μ‚¬μš©ν•  수 μ—†λ‹€.

  2. λ³΅μž‘ν•œ 연산은 μΈμŠ€ν„΄μŠ€ μ•ˆμ—μ„œ μ²˜λ¦¬ν•˜κ³  ν™”λ©΄μ—λŠ” κ°„λ‹¨ν•œ μ—°μ‚° 결과만 ν‘œμ‹œν•΄μ•Όν•œλ‹€.

computed

cpmputed 속성은 데이터 연산듀을 μ •μ˜ν•˜λŠ” μ˜μ—­μ΄λ‹€.

λ³΅μž‘ν•œ 계산은 computed (데이터 속성을 μžλ™μœΌλ‘œ κ³„μ‚°ν•΄μ£ΌλŠ” 속성)λ₯Ό μ΄μš©ν•˜μ—¬ λ‚˜νƒ€λ‚΄λŠ” 것이 μ’‹λ‹€. HTML에 μ΅œμ’…μ μœΌλ‘œ ν‘œν˜„λ  κ°’λ§Œ λ‚˜νƒ€λ‚΄κ³ , λ°μ΄ν„°μ˜ 기본연산은 μžλ°”μŠ€ν¬λ¦½νŠΈ λ‹¨μ—μ„œ ν•¨μœΌλ‘œμ¨ 화면단 μ½”λ“œμ˜ 가독성을 높일 수 있기 λ•Œλ¬Έμ΄λ‹€. λ˜ν•œ 반볡적인 연산에 λŒ€ν•΄μ„œλŠ” 미리 κ³„μ‚°ν•˜μ—¬ μ €μž₯ν•΄ 놓고, ν•„μš”ν•  λ•Œ λ°”λ‘œ λΆˆλŸ¬μ˜€λŠ” caching 효과λ₯Ό 얻을 수 μžˆλ‹€.

즉, computed 속성은 λ‹€μŒκ³Ό 같은 μž₯점을 κ°€μ§€κ³  μžˆλ‹€.

  • data 속성 κ°’μ˜ 변화에 따라 μžλ™μœΌλ‘œ λ‹€μ‹œ μ—°μ‚°ν•œλ‹€.

  • caching : λ™μΌν•œ 연산을 λ°˜λ³΅ν•΄μ„œ ν•˜μ§€ μ•ŠκΈ° μœ„ν•΄ μ—°μ‚°μ˜ κ²°κ³Ό 값을 미리 μ €μž₯ν•˜κ³  μžˆλ‹€κ°€ ν•„μš”ν•  λ•Œ λΆˆλŸ¬μ˜€λŠ” λ™μž‘ ( 쒅속 λŒ€μƒ )

computed vs methods

methods 속성은 ν˜ΈμΆœν•  λ•Œλ§Œ ν•΄λ‹Ή 둜직이 μˆ˜ν–‰λ˜κ³ , computed 속성은 λŒ€μƒ 데이터 값이 λ³€κ²½λ˜λ©΄ μžλ™μ μœΌλ‘œ μˆ˜ν–‰λœλ‹€. 즉, μˆ˜λ™μ μœΌλ‘œ 데이터λ₯Ό κ°±μ‹ ν•˜λŠ”μ§€, λŠ₯λ™μ μœΌλ‘œ 데이터λ₯Ό κ°±μ‹ ν•˜λŠ”μ§€μ˜ 차이이닀.

methods속성은 μˆ˜ν–‰ν•  λ•Œλ§ˆλ‹€ 연산을 ν•˜κΈ° λ•Œλ¬Έμ— λ³„λ„λ‘œ 캐싱을 ν•˜μ§€ μ•Šμ§€λ§Œ, computed 속성은 데이터가 λ³€κ²½λ˜μ§€ μ•ŠλŠ” ν•œ 데이터λ₯Ό μΊμ‹±ν•˜κ³  μžˆλ‹€κ°€, ν•„μš”ν• λ•Œ λ°˜ν™˜ν•΄ μ€€λ‹€. λ”°λΌμ„œ, λ³΅μž‘ν•œ 연산을 반볡 μˆ˜ν–‰ν•΄μ„œ 화면에 λ‚˜νƒ€λ‚΄μ•Ό ν•œλ‹€λ©΄, computed 속성을 μ΄μš©ν•˜λŠ” 것이 μ„±λŠ₯λ©΄μ—μ„œ 더 νš¨μœ¨μ μ΄λ‹€.

computed 속성은 쒅속 λŒ€μƒμ„ 따라 μ €μž₯(캐싱)되기 λ•Œλ¬Έμ— Date.now() 와 같이 아무곳에도 μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ” 속성은 μ ˆλŒ€λ‘œ updateλ˜μ§€ μ•ŠλŠ”λ‹€.

computed vs watch

watch 속성은 데이터 λ³€ν™”λ₯Ό 감지해 μžλ™μœΌλ‘œ νŠΉμ • λ‘œμ§μ„ μˆ˜ν–‰ν•œλ‹€. computed 속성과 μœ μ‚¬ν•˜μ§€λ§Œ computed 속성은 λ‚΄μž₯ APIλ₯Ό ν™œμš©ν•œ κ°„λ‹¨ν•œ 연산에 μ ν•©ν•œ 반면, watch 속성은 데이터 호좜과 같이 μ‹œκ°„μ΄ μƒλŒ€μ μœΌλ‘œ 많이 μ†Œλͺ¨λ˜λŠ” 비동기 μ²˜λ¦¬μ— μ ν•©ν•˜λ‹€.

Directive

λ·° λ””λ ‰ν‹°λΈŒλž€ HTML νƒœκ·Έ μ•ˆμ— v-접두사λ₯Ό κ°€μ§€λŠ” λͺ¨λ“  속성듀을 μ˜λ―Έν•œλ‹€. μ•žμ—μ„œ 닀룬 v-bind 속성도 λ””λ ‰ν‹°λΈŒμ— ν•΄λ‹Ήλœλ‹€. λ””λ ‰ν‹°λΈŒλŠ” ν™”λ©΄μ˜ μš”μ†Œλ₯Ό 더 μ‰½κ²Œ μ‘°μž‘ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” κΈ°λŠ₯으둜 뷰의 데이터 값이 λ³€κ²½λ˜μ—ˆμ„ λŒ€ ν™”λ©΄μ˜ μš”μ†Œλ“€μ΄ λ³€κ²½λœ 데이터 값에 따라 κ°±μ‹ λœλ‹€. ν™”λ©΄μ˜ μš”μ†Œλ₯Ό 직접 μ œμ–΄ν•  ν•„μš”μ—†μ΄ 뷰의 λ””λ ‰ν‹°λΈŒλ₯Ό ν™œμš©ν•΄ ν™”λ©΄ μš”μ†Œλ₯Ό μ‘°μž‘ν•  수 μžˆλ‹€.

λ””λ ‰ν‹°λΈŒ μ’…λ₯˜

μ—­ν• 

v-if

μ§€μ •ν•œ λ·° 데이터 κ°’μ˜ μ°Έ, κ±°μ§“ 여뢀에 따라 ν•΄λ‹Ή HTML νƒœκ·Έλ₯Ό 화면에 ν‘œμ‹œν•˜κ±°λ‚˜ ν‘œμ‹œν•˜μ§€ μ•ŠλŠ”λ‹€. (ν•΄λ‹Ή νƒœκ·Έ μ™„μ „νžˆ μ‚­μ œ)

v-for

μ§€μ •ν•œ λ·° λ°μ΄ν„°μ˜ 개수만큼 ν•΄λ‹Ή HTML νƒœκ·Έλ₯Ό 반볡 좜λ ₯ν•œλ‹€.

v-show

v-if와 μœ μ‚¬ν•˜κ²Œ λ°μ΄ν„°μ˜ μ§„μœ„ 여뢀에 따라 ν•΄λ‹Ή HTML νƒœκ·Έλ₯Ό 화면에 ν‘œμ‹œν•˜κ±°λ‚˜ ν‘œμ‹œν•˜μ§€ μ•ŠλŠ”λ‹€. (display:none css λ₯Ό μ£Όμ–΄ μ‹€μ œ νƒœκ·ΈλŠ” 남아 있고, ν™”λ©΄μƒμœΌλ‘œλ§Œ 보이지 μ•ŠμŒ)

v-bind

HTML νƒœκ·Έμ˜ κΈ°λ³Έ 속성과 λ·° 데이터 속성 μ—°κ²°

v-on(@)

ν™”λ©΄ μš”μ†Œμ˜ 이벀트λ₯Ό κ°μ§€ν•˜μ—¬ μ²˜λ¦¬ν•  λ•Œ μ‚¬μš© v-on:을 κ°„μ†Œν™”ν•œ 문법은 @ 이닀.

v-model

formμ—μ„œ 주둜 μ‚¬μš©λ˜λŠ” μ†μ„±μœΌλ‘œ, 폼에 μž…λ ₯ν•œ 값을 λ·° μΈμŠ€ν„΄μŠ€μ˜ 데이터와 μ¦‰μ‹œ λ™κΈ°ν™”ν•œλ‹€. 화면에 μž…λ ₯된 값을 μ €μž₯ν•΄ μ„œλ²„μ— λ³΄λ‚΄κ±°λ‚˜ watch 와 같은 속성을 μ΄μš©ν•΄ μΆ”κ°€ λ‘œμ§μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€. <input>, <select>, <textarea> νƒœκ·Έμ—λ§Œ μ‚¬μš©κ°€λŠ₯

이벀트 처리

λ·° ν™”λ©΄μ—μ„œ λ°œμƒν•œ 이벀트λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ v-on λ””λ ‰ν‹°λΈŒμ™€ methods 속성을 ν™œμš©ν•œλ‹€.

λ‹€μŒ μ˜ˆμ œλŠ” v-on:click λ””λ ‰ν‹°λΈŒλ₯Ό μΆ”κ°€ν•˜μ—¬ 클릭 λ²„νŠΌ ν΄λ¦­μ‹œ clickBtn λ©”μ„œλ“œκ°€ μ‹€ν–‰λœλ‹€.

λ‹€μŒκ³Ό 같이 인자λ₯Ό λ„˜κΈΈ 수 μžˆλ‹€. μΆ”κ°€μ μœΌλ‘œ event 인자λ₯Ό μ΄μš©ν•΄ ν™”λ©΄ 돔 μ΄λ²€νŠΈμ— μ ‘κ·Όν•  수 μžˆλ‹€.

function(event){} 와 같이 event 인자λ₯Ό μ •μ˜ν•˜λ©΄ ν•΄λ‹Ή 돔 μš”μ†Œμ˜ 이벀트 객체에 μ ‘κ·Όν•  수 μžˆλ‹€.

Last updated