이번에는 age 입력란을 다뤄보자.
나이 입력란의 데이터타입은 숫자다. (input type="number")
하지만 type="number"라고 해서 입력한 데이터를 코드에서도 number타입으로 취급하는건 아니다.
분명히 number처럼 보이고, number말고는 입력할 수도 없는데 코드에서는 자동으로 number를 취하지 않는다.
data 프로퍼티로 userAge 초기값을 null로 하자.
<template>
<form @submit.prevent="submitForm">
<div class="form-control">
<label for="age">Your Age (Years)</label>
<input
id="age"
name="age"
type="number"
v-model="userAge"
ref="ageInput"
/>
</div>
<div>
<button>Save Data</button>
</div>
</form>
</template>
<script>
export default {
data() {
return {
userAge: null,
};
},
methods: {
submitForm() {
console.log('User age: ');
console.log(this.userAge);
console.log(31);
this.userAge = null;
},
},
};
</script>
나이 입력란에 숫자를 적고 'Save Data'버튼을 클릭하면 submitForm메서드가 트리거된다.
# v-model로 가져온 숫자 입력값 → number
콘솔을 보면 나이 입력란에 작성한 '30'과 console.log(31)로 찍은 '31'이 차이가 없다. 두 숫자 모두 콘솔에서 '파란색'으로 나타난다. 즉 type이 둘다 number이다.
# ref로 가져온 숫자 입력값 → string
v-model을 작성하지 않고 ref로 가져오는 경우를 보자.
ref를 추가한 후, submitForm 메서드에서 console.log로 this.$refs.ageInput.value를 콘솔에 출력해보자.
네이티브 DOM요소에 액세스하고, value 프로퍼티에 액세스해 값을 출력한다.
이렇게 작성하고 나이 입력란에 32를 입력해보자.
methods: {
submitForm() {
console.log(this.userAge);
console.log(this.$refs.ageInput.value);
console.log(31);
},
},
- 첫번째 32 : v-model에 바인딩되어 내부적으로 관리되는 data 프로퍼티.
- 두번째 32 : ref로 출력하는 값
- 마지막 31 : console.log로 출력하는 더미숫자
흥미로운 점은, 첫번째 32는 파란색, 두번째 32는 검은색이다.
즉, 파란색은 number 타입, 검은색은 string 타입이라는 뜻이다. 즉, 데이터 타입이 다르다.
왜 이런걸까?
data에서 관리하는 프로퍼티와 ref로 데이터를 가져오는 프로퍼티에 각각 5를 더해보자.
methods: {
submitForm() {
console.log(this.userAge + 5);
console.log(this.$refs.ageInput.value + 5);
console.log(31);
},
},
data 프로퍼티값은 37이 뜨지만, ref 프로퍼티값은 '325'가 뜬다.
이건 수학적 오류가 아니라, 32(string)와 5(number)가 한 문자열로 연결된거다.
(참고로, string + number = string이 된다.)
여기서 알아야 할 흥미로운 점은, 숫자 타입의 입력란에 v-model을 사용하면 자동으로 유저가 입력한 데이터를 문자열에서 숫자 타입 데이터로 변환한다는 것.
<input id="age" name="age" type="number" v-model="userAge" />
JavaScript만 사용하거나, refs 프로퍼티를 사용해서 네이티브 JS객체로 입력데이터(this.$refs.ageInput.value)를 나타낸다면 저장된 해당 값의 데이터 타입은 기본적으로 항상 문자열이다.
Vue는 v-model이라는 추가적인 기능을 통해 이 입력란의 데이터타입이 숫자임을 확인해 문자열 → 숫자로 변환해준다.
# 수식어를 통한 type 변경
타입을 변환하도록 '강제'할수도 있는데, 만약 다른 타입의 데이터를 사용한다면(type="text") v-model 뒤에 수식어(modifier)를 추가함으로써 Vue가 데이터를 변환하게 만들 수 있다.
number라는 수식어를 추가한다면, v-model이 자동으로 다른 타입을 '숫자' 타입으로 변환한다.
<input id="age" name="age" type="text" v-model.number="userAge" />
## 다른 수식어
number 외에도 다른 수식어들이 있다.
1) lazy
- 입력된 값이 바로 data에 반영되지 않고, enter를 누르거나 포커스가 벗어나는 등의 이벤트가 발생할 경우에만 값이 반영되어 나타난다.
- 바인딩한 프로퍼티를 업데이트하는 방법을 바꿀 수 있다. 모든 키 입력에 적용하거나, 일부 입력에만 적용하면 낮은 빈도로 업데이트한다.
2) trim
- 입력된 텍스트의 앞, 뒤에 붙은 불필요한 공백을 Vue가 제거하도록 한다.
- 문자열에 직접 trim 메서드를 작성하는것과 같은 같은 결과가 나타난다.
- trim을 추가하면 입력한 데이터 앞, 뒤에 입력한 공백이 나타나지 않게 만들 수 있다.
이렇게 애플리케이션에 나타나는 흔한 버그일 수 있다.
위 경우처럼, input에서 ref로 가져온 value가 숫자 타입이라고 생각했지만 실제로는 문자열 타입인거다.
그리고 v-model의 특별한 기능을 알아두는것도 특히 중요하다.
v-model이나 ref를 이용해 데이터에 액세스할 수 있지만, 사실 내부적으로는 이 두 방법이 조금 다르다.
ref를 사용해도 상관없지만 자동으로 타입변환이 일어나지 않는다는걸 알아야한다.
** 출처: 모든 내용은 Udemy Vue-완벽가이드 강의를 기반으로 작성하였습니다.
'Vue.js' 카테고리의 다른 글
[Udemy Vue 완벽가이드 Section11] 145. 체크박스 및 라디오 버튼과 함께 v-model 사용하기 (0) | 2023.09.13 |
---|---|
[Udemy Vue 완벽가이드 Section11] 144. v-model 및 드롭다운 (0) | 2023.09.13 |
[Udemy Vue 완벽가이드 Sectio11] 142. v-model 및 입력 (0) | 2023.09.11 |
[Udemy Vue 완벽가이드 Section9] 124. 다른 폴더 구조로 이동하기 (0) | 2023.09.01 |
[Udemy Vue 완벽가이드 Section9] 123. Vue 스타일 가이드 (0) | 2023.09.01 |