V-Model λ™μž‘ 원리와 ν™œμš© 방법

2022. 6. 1. 22:26ㆍFront-End μž‘μ—…μ‹€/기타 μ°Έκ³  자료

728x90
λ°˜μ‘ν˜•

 

참고 자료 : https://joshua1988.github.io/web-development/vuejs/v-model-usage/

 

 

πŸš€ V-modelμ΄λž€?

    πŸ”½  속성

곡식 λ¬Έμ„œμ— μ•ˆλ‚΄λœ v-model μ†μ„±μ˜ μ‚¬μš©λ²•μ€ μ•„λž˜μ™€ κ°™μ•„μš”.

<input v-model="inputText">
new Vue({
	data: {
    	inputText: ''
	}
})

 

μ΄λ ‡κ²Œ 이용자의 μž…λ ₯을 λ°›λŠ” UI μš”μ†Œλ“€μ— v-modelμ΄λΌλŠ” 속성을 μ‚¬μš©ν•˜λ©΄ μž…λ ₯ 같이 μžλ™μœΌλ‘œ λ·° Data 속성에 μ—°κ²°λ˜κ²Œ λ˜λŠ” κ²ƒμ΄μ—μš”.

 

 

 

 

    πŸ”½  v-model λ™μž‘ 방식

v-model 속성은 v-bind와 v-on의 κΈ°λŠ₯의 μ‘°ν•©μœΌλ‘œ λ™μž‘ν•˜κ²Œ λ˜μš”.
맀번 κ°œλ°œμžκ°€ ν•˜λ‚˜ν•˜λ‚˜ v-bind와 v-on 속성을 λ‹€ 지정해 주지 μ•Šμ•„λ„ μ’€ 더 νŽΈν•˜κ²Œ κ°œλ°œν•  수 μž‡κ²Œ κ³ μ•ˆλœ 문법인 κ²ƒμ΄μ—μš”. μ•žμ—μ„œ μ‚΄νŽ΄λ³Έ μ½”λ“œλ₯Ό μ•„λž˜μ™€ 같이 변경해도 λ™μž‘ν•˜κ²Œ λ©λ‹ˆλ‹€.

<input v-bind:value="inputText" v-on:input="updateInput">
new Vue({
	data: {
    	inputText: ''
    },
    
    methods: {
    	updateInput: function(event) {
        	var updatedText = event.target.value;
            this.inputText = updatedText;
        }
    }
})

 

μ—¬κΈ°μ„œ μš°λ¦¬λŠ” 3가지λ₯Ό μ΄ν•΄ν•˜κ³  λ„˜μ–΄κ°€μ•Ό ν•˜λŠ” κ²ƒμ΄μ—μš”.

● v-bind μ†μ„±μ€ λ·° μΈμŠ€ν„΄μŠ€μ˜ 데이터 속성을 HTML μš”μ†Œμ— μ—°κ²°.
● v-on μ†μ„±μ€ ν•΄λ‹Ή HTML μš”μ†Œμ˜ Eventλ₯Ό λ·° μΈμŠ€ν„΄μŠ€ Logicκ³Ό μ—°κ²°.
● μ‚¬μš©μž Event에 μ˜ν•΄ μ‹€ν–‰λœ λ·° Method ν•¨μˆ˜μ˜ 첫번째 μΈμžμ—λŠ” ν•΄λ‹Ή Eventκ°€ λ“€μ–΄μ˜¨λ‹€.

 

πŸ’‘ μ°Έκ³  사항
HTML μž…λ ₯ μš”μ†Œμ˜ μ’…λ₯˜μ— 따라 `v-model` 속성이 λ‹€μŒκ³Ό 같이 ꡬ성.

1) input Tagμ—λŠ” `value / input`
2) checkbox Tagμ—λŠ” `checked / change`
3) select Tagμ—λŠ” `value / change`

 

λ°˜μ‘ν˜•

 

        πŸ“¦ v-model이 만λŠ₯ 해결사?

λΉ λ₯΄κ²Œ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κ³  ν”„λ‘œν† νƒ€μ΄ν•‘μ„ ν•΄ λ‚˜κ°ˆ λ•ŒλŠ” v-model을 μ‚¬μš©ν•΄λ„ μ’‹μœΌλ‚˜, ν˜„μž¬ μ‹œμ μ—μ„œ IME μž…λ ₯(ν•œκΈ€, 일본어, 쀑ꡭ어에 λŒ€ν•΄μ„œ μ•„λž˜μ™€ 같은 ν•œκ³„κ°€ μžˆμŠ΅λ‹ˆλ‹€.

 

 

μœ„ 화면을 보면 ν•œκΈ€ μž…λ ₯의 경우 ν•œ κΈ€μžμ— λŒ€ν•œ μž…λ ₯이 λλ‚˜μ•Ό inputText Dataκ°€ Input Box의 Text κ°’κ³Ό 동기화 λ˜λŠ” 것을 λ³Ό 수 μžˆμ–΄μš”.

μœ„μ™€ 같은 문제둜 인해 λ·° 곡식 λ¬Έμ„œμ—μ„œλŠ” ν•œκΈ€ μž…λ ₯을 λ‹€λ£° λ•ŒλŠ” v-bind:value와 v-on:input을 직접 μ—°κ²°ν•΄μ„œ μ΄μš©ν•˜λŠ” 것을 ꢌ고 ν•˜κ³  μžˆλ‹΅λ‹ˆλ‹€.

 

 

        πŸ“¦ v-model을 μ΄μš©ν•΄μ„œ ν•œκΈ€ μ²˜λ¦¬ν•˜λŠ” 방법

ν•œκΈ€ μž…λ ₯을 μ²˜λ¦¬ν•  λ•Œ, v-model λŒ€μ‹  직접 Event와 값을 μ‘°ν•©ν•΄μ„œ Binding ν•˜λŠ” 것은 κ°œλ°œμžκ°€ μ’‹μ•„ν•˜λŠ” 방법은 아닐 κ²ƒμ΄μ—μš”. 이럴 땐 μ•„λž˜μ™€ 같이 Input Componentλ₯Ό λ³„λ„μ˜ Component둜 λΆ„λ¦¬ν•˜λ©΄ v-model둜 νŽΈν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆμ–΄μš”.

<!-- BaseInput.vue - μ‹±κΈ€ 파일 μ»΄ν¬λ„ŒνŠΈ ꡬ쑰-->
<template>
  <input v-bind:value="value" v-on:input="updateInput">
</template>

<script>
export default {
  props: ['value'],
  methods: {
    updateInput: function(event) {
      this.$emit('input', event.target.value);
    }
  }
}
</script>


μœ„μ˜ CodeλŠ” μ–΄λ–»κ²Œ λ™μž‘μ„ ν•˜λŠ” κ²ƒμΌκΉŒμš”?

 

● BaseInput Component의 μƒμœ„ Componentμ—μ„œ props둜 받은 valueλ₯Ό input Tag κ°’μœΌλ‘œ μ—°κ²°.
● Input Tag에 값이 μž…λ ₯ 되면 Input Tagμ—μ„œ input Eventκ°€ λ°œμƒν•˜κ³ , updateInput Method μ‹€ν–‰.
● updateInput Methodμ—μ„œ Input Tag에 μž…λ ₯된 값을 μƒμœ„ Component input Envet둜 전달.


이제 μƒμœ„ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ•„λž˜μ™€ 같이 μ΄μš©ν•  수 μžˆμ–΄μš”.

<!-- App.vue - μ‹±κΈ€ 파일 μ»΄ν¬λ„ŒνŠΈ ꡬ쑰 -->
<template>
  <div>
    <base-input v-model="inputText"></base-input>
  </div>
</template>

<script>
import BaseInput from './BaseInput.vue';

export default {
  components: {
    'base-input': BaseInput
  },
  data: function() {
    return {
      inputText: ''
    }
  }
}
</script>


μ—¬κΈ°μ„œ μš°λ¦¬κ°€ μ£Όλͺ©ν•΄μ•Ό ν•  뢀뢄은 μ‚¬μš°μ΄ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ •μ˜ν•œ Data 값을 ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈλ‘œ λ‚΄λ €λ³΄λ‚΄λŠ” 뢀뢄인 κ²ƒμ΄μ—μš”.

ν‰μ†Œμ— μ‚¬μš©ν•˜λ˜ Props 속성 λŒ€μ‹  v-model이 μ‚¬μš©λ˜μ—ˆλŠ”λ°, 이미 μ•ž v-model λ™μž‘ λ°©μ‹μ—μ„œ v-model 속성은 v-dind:value와 v-on:input을 μ‘°ν•©ν•΄μ„œ λ§Œλ“€μ—ˆλ‹€λŠ” 것을 곡뢀 ν–ˆκΈ° λ•Œλ¬Έμ— v-model 속성에 μ—°κ²°ν•œ 값이 ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ— valueλΌλŠ” Props μ†μ„±μœΌλ‘œ λ‚΄λ € κ°„λ‹€λŠ” 사싀을 μ•Œ 수 μžˆμ–΄μš”.



 

 

 

 

 

 

728x90
λ°˜μ‘ν˜•

'Front-End μž‘μ—…μ‹€ > 기타 μ°Έκ³  자료' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[FrontEnd] HMR(Hot Module Replacement)  (0) 2022.05.22
[Vue.js & Nuxt.js]Vuexλž€?  (0) 2022.04.01
[FrontEnd] html Tag 정리  (0) 2022.03.14
[CSS] background, background-size  (0) 2022.03.14
[CSS] Color 속성  (0) 2022.03.13