λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
[개발] Practice/Vue.js

[Vue.js] watcher 둜 데이터 κ°μ‹œν•˜κΈ°

by Connecting-the-dots 2022. 4. 3.
728x90
λ°˜μ‘ν˜•

πŸ’‘ μ‹€μŠ΅ 포인트!

  • 이제 1~36 μ‚¬μ΄μ˜ 숫자λ₯Ό μž…λ ₯ν•˜λ©΄, ν•΄λ‹Ή κ°œμ›” μˆ˜μ— λ§žλŠ” κΈˆμ•‘μ„ μžλ™μœΌλ‘œ κ³„μ‚°ν•˜μ—¬ ν‘œμ‹œν•΄μ€€λ‹€.
  • μ˜μ–΄λ“  ν•œκΈ€μ΄λ“  문자λ₯Ό ν•œ κ°œλΌλ„ μž…λ ₯ν•  경우, 상단에 "숫자만 μž…λ ₯ν•˜μ„Έμš”." λΌλŠ” μ•Œλ¦Όμ°½μ„ λ„μ›Œμ€€λ‹€.
  • μž…λ ₯ν•œ κ°œμ›” μˆ˜κ°€ 1보닀 μž‘μœΌλ©΄ "μ΅œμ†Œ 1κ°œμ›”λΆ€ν„° 선택 κ°€λŠ₯ν•©λ‹ˆλ‹€." λΌλŠ” μ•Œλ¦Όμ°½μ„ λ„μš΄ ν›„ months λ₯Ό λ‹€μ‹œ μž…λ ₯ν•  수 있게 κ³΅λž€μœΌλ‘œ λ°”κΏ”μ£Όκ³ , μž…λ ₯ν•œ κ°œμ›” μˆ˜κ°€ 36κ°œμ›”λ³΄λ‹€ 크면 "μ΅œλŒ€ 36κ°œμ›”κΉŒμ§€ 선택 κ°€λŠ₯ν•©λ‹ˆλ‹€." λΌλŠ” μ•Œλ¦Όμ°½μ„ λ„μš΄ ν›„ months 값을 36κ°œμ›”λ‘œ λ°”κΎΈμ–΄μ€€λ‹€.

πŸ’œ λ“€μ–΄κ°€κΈ° 전에

  • μ‚¬μš©μžκ°€ <input> 에 μž…λ ₯ν•˜λŠ” λ°μ΄ν„°λŠ” 무쑰건 String νƒ€μž…μ˜ λ¬Έμžμ—΄μ— ν•΄λ‹Ήν•œλ‹€.
  • 즉, μ‚¬μš©μžκ°€ 123 을 μž…λ ₯ν–ˆλ‹€κ³  해도 μ €μž₯λ˜λŠ” 값은 '123' 이 λ˜λŠ” 것이닀.
  • λ§Œμ•½ λ¬Έμžμ—΄μ„ κ°•μ œλ‘œ 숫자둜 λ°”κΎΈμ–΄μ„œ λ°μ΄ν„°λ‘œ μ €μž₯ν•˜κ³  μ‹ΆμœΌλ©΄ v-model.number="데이터이름" κ³Ό 같이 v-model 에 .number λ₯Ό λΆ™μ—¬μ£Όλ©΄ λœλ‹€.
  • λ‹€λ§Œ, 이 방법은 <input> 에 λ¬Έμžμ—΄μ΄ μž…λ ₯λ˜λŠ” 것 자체λ₯Ό 막을 μˆ˜λŠ” μ—†μœΌλ―€λ‘œ, 이λ₯Ό 막고 μ‹Άλ‹€λ©΄ watcher λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

πŸ’œ watcher μ‚¬μš©ν•˜κΈ°

🀍 watcher μ•Œμ•„λ³΄κΈ°

<script>
export default {
	data(){
		return {
		}
	},
	watch: {
    	// 여기에 watcher λ₯Ό μ‚¬μš©ν•  데이터λ₯Ό 적어주면 λœλ‹€.
	},
}
</script>
  • watcher λŠ” <script><script> 내에 watch : { } λΌλŠ” ν•­λͺ©μ„ μƒˆλ‘œ λ§Œλ“€μ–΄μ„œ μž‘μ„±ν•΄μ£Όλ©΄ λœλ‹€.
  • νŠΉμ • 데이터가 변경될 λ•Œλ§ˆλ‹€ 싀행될 μ½”λ“œλ₯Ό 여기에 μž‘μ„±ν•΄λ†“μœΌλ©΄, watcher κ°€ ν•΄λ‹Ή λ°μ΄ν„°μ˜ 변경이 λ°œμƒν•  λ•Œλ§ˆλ‹€ κ°μ§€ν•˜μ—¬ 여기에 기재된 μ½”λ“œκ°€ μ‹€ν–‰λœλ‹€.  

 

export default {
  name: 'Modal',
  data(){
    return {
      months : ""
    }
  },
  watch : {
    months(){
      // months κ°€ 변경될 λ•Œ μ‹€ν–‰ν•  μ½”λ“œ
    }
  }
}
  • 이제 watch : { } μ•ˆμ— ν•¨μˆ˜λ₯Ό 집어넣을 수 μžˆλŠ”λ°, ν•¨μˆ˜λͺ…은 λ‚΄κ°€ watcher λ₯Ό μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” 데이터 μ΄λ¦„μœΌλ‘œ μž‘μ„±ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.
  • 예λ₯Ό λ“€μ–΄, λ‚˜λŠ” κ·Έ 전에 data 보관함에 λ§Œλ“€μ–΄λ‘” months λΌλŠ” 데이터에 watcher λ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터 변경을 κ°μ§€ν•˜κ³  μ‹Άλ‹€κ³  ν•œλ‹€λ©΄ ν•¨μˆ˜μ˜ 이름은 months κ°€ λ˜λŠ” 것이닀.
  • 그리고 ν•¨μˆ˜ μ•ˆμ—λŠ” months κ°€ 변경될 λ•Œλ§ˆλ‹€ μ‹€ν–‰ν•  μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ£Όλ©΄ λœλ‹€.
  • ν•¨μˆ˜μ—λŠ” νŒŒλΌλ―Έν„°λ₯Ό λ°›μ•„μ˜¬ 수 μžˆλŠ”λ°, 첫번째둜 λ°›μ•„μ˜€λŠ” νŒŒλΌλ―Έν„°λŠ” 변경될 κ°’, λ‘λ²ˆμ§Έλ‘œ λ°›μ•„μ˜€λŠ” νŒŒλΌλ―Έν„°λŠ” λ³€κ²½μ „ 값을 μ˜λ―Έν•˜λ©° μ΅œλŒ€ 2κ°œκΉŒμ§€ λ°›μ•„μ˜¬ 수 μžˆλ‹€.

🀍 watcher μ‚¬μš©ν•΄λ³΄κΈ°

// 전체 μ½”λ“œ 미리보기
// 전체 μ½”λ“œ λ‚΄μš©μ΄ κΈΈμ–΄ λΆˆν•„μš”ν•œ 뢀뢄은 μ œμ™Έν–ˆλ‹€.

<template>
    <input @input="changeKeyword" :value="months">
    <p>{{months}}κ°œμ›” 선택: {{ rooms[clickedRoom].price * months }}원</p>
</template>

<script>
export default {
    name: 'Modal',
	data(){
		return {
			months : "",
		}
	},
	watch: {
		months(input){
			if (isNaN(input) === true){
				alert('숫자만 μž…λ ₯ν•˜μ„Έμš”.');
				this.months = "";
			}
			if (input > 36){
				alert('μ΅œλŒ€ 36κ°œμ›”κΉŒμ§€ 선택 κ°€λŠ₯ν•©λ‹ˆλ‹€.');
				this.months = 36;
			} else if (input < 1) {
				alert('μ΅œμ†Œ 1κ°œμ›”λΆ€ν„° 선택 κ°€λŠ₯ν•©λ‹ˆλ‹€.');
				this.months = "";
			}
		}
	},
    methods: {
		changeKeyword(e){
			this.months = e.target.value;
		},
    }
}
</script>
  • μ• μ΄ˆμ— λ‚˜λŠ” 숫자만 μž…λ ₯λ°›κ³  μ‹Άμ—ˆκΈ° λ•Œλ¬Έμ—, 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ ꡬ글링을 많이 ν•΄λ³΄μ•˜λ‹€.
  • λ¬Έμžκ°€ μž…λ ₯λ˜λŠ” κ²½μš°μ— μ•Œλ¦Όμ°½μ„ λ„μš°κ³  μž…λ ₯된 값을 μ΄ˆκΈ°ν™”ν•˜κ³ μž ν•˜μ˜€λŠ”λ° v-model 을 μ‚¬μš©ν–ˆμ„ λ•Œ λ­”κ°€ μ΄μƒν•˜κ²Œ μž‘λ™ν•˜λŠ” 것 κ°™μ•„ ꡬ글링을 ν•΄λ³΄μ•˜λ‹€.
  • κ΅¬κΈ€λ§ν•œ κ²°κ³Ό, v-model 을 μ‚¬μš©ν–ˆμ„ λ•Œ μž…λ ₯ν•œ λ¬Έμžκ°€ μ˜μ–΄λΌλ©΄ μ •μƒμ μœΌλ‘œ μ–‘λ°©ν˜• 바인딩이 λ˜μ–΄ μžˆμ–΄ λ°”λ‘œλ°”λ‘œ μ•Œλ¦Όμ°½μ΄ μ œλŒ€λ‘œ λœ¨μ§€λ§Œ, ν•œκΈ€μ„ μž…λ ₯ν•˜λŠ” κ²½μš°μ—λŠ” 자음과 λͺ¨μŒμ΄ μ‘°ν•©λ˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œλŠ” 바인딩이 λ˜μ§€ μ•Šμ•„ μ•Œλ¦Όμ°½μ΄ μ œλŒ€λ‘œ λœ¨μ§€ μ•ŠλŠ” λ¬Έμ œκ°€ λ°œμƒν•œλ‹€λŠ” 사싀을 μ•Œμ•„λƒˆλ‹€.
  • λ”°λΌμ„œ, 이런 쑰합이 ν•„μš”ν•œ 언어듀은 v-model directive λ₯Ό ν™œμš©ν•  λ•Œ λ¬Έμ œκ°€ μƒκΈ°λ―€λ‘œ, @input 을 ν™œμš©ν•΄μ•Ό ν•œλ‹€λŠ” 것이닀.
  • κ·Έλž˜μ„œ v-model λŒ€μ‹  @input 을 μ‚¬μš©ν•˜μ—¬ μ–‘λ°©ν–₯ 바인딩이 μ •ν™•ν•˜κ²Œ λ˜λ„λ‘ν•΄μ£Όμ—ˆλ‹€.
  • κ·Έ λ‹€μŒμ—, <input> 에 μž…λ ₯받은 값이 μˆ«μžκ°€ μ•„λ‹ˆλΌλ©΄ "숫자만 μž…λ ₯ν•˜μ„Έμš”." λΌλŠ” μ•Œλ¦Όμ°½μ΄ 뜨며 μž…λ ₯값이 κ³΅λž€μœΌλ‘œ μ΄ˆκΈ°ν™”λ˜λ„λ‘ ν•΄μ£Όμ—ˆκ³ , μž…λ ₯λ°›λŠ” μˆ«μžλŠ” 1~36κΉŒμ§€λ§Œ κ°€λŠ₯ν•˜λ„λ‘ ν•˜μ—¬ ν•΄λ‹Ή λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λ©΄ 그에 μ•Œλ§žλŠ” μ•Œλ¦Όμ°½κ³Ό ν•¨κ»˜ λ‚΄κ°€ μ§€μ •ν•œλŒ€λ‘œ 값을 μ΄ˆκΈ°ν™”ν•˜λ„λ‘ ν•΄μ£Όμ—ˆλ‹€.

πŸ“Œ μ°Έκ³ ν•œ λΈ”λ‘œκ·Έ 및 자료

 

728x90
λ°˜μ‘ν˜•