앞서 작성했던 포스팅을 보충하고자 추가적으로 작성함.
v-model을 사용하면 양방향 바인딩이 가능해서 양식 리셋에도 도움이 된다.
또한 양방향 바인딩을 통해 사용자가 입력한 데이터만 수신하는 게 아니라 form에 있는 데이터를 덮어쓸 수도 있다.
게다가 input 요소에 저장된 값도 바꿀 수 있다.
<form @submit.prevent="submitForm">
<input id="user-name" name="user-name" type="text" v-model.trim="userName" @blur="validateInput" />
...
.trim
디렉션을 붙일 수 있다.만약 위 코드처럼 작성한다면 type 상관없이 항상 String일 것이다. 하지만 Vue가 자동으로 입력한 데이터를 페칭하고 문자열 => 숫자로 변환해준다.
이때 number의 초기값은 0도 빈문자열''
도 아닌 null로 초기화를 해주어야한다.
만약 ref를 쓴다면 자동으로 페칭이 안 이루어지는데 이 또한 modifier로 자동으로 바꿔줄 수 있다.
<input id="age" name="age" type="number" v-model.number="userAge" ref="ageInput" />
즉, 만약 당신이 v-model이 아닌 ref를 사용한다면 type값이 number이다 하더라도 이는 항상 문자열로 받는다.
<template>
<input id="interest-news" name="interest" type="checkbox" value="news" v-model="interest" />
<input id="interest-news" name="interest" type="checkbox" value="tutorials" v-model="interest" />
</template>
<script>
data(){
return {
interest:null (X)
interest:[] (O)
}
}
</script>
<div>
<input id="how-video" name="how" type="radio" value="video" v-model="how" />
<label for="how-video">Video Courses</label>
</div>
<div>
<input id="how-blogs" name="how" type="radio" value="blogs" v-model="how" />
<label for="how-blogs">Blogs</label>
</div>
<div>
<input id="how-other" name="how" type="radio" value="other" v-model="how" />
<label for="how-other">Other</label>
</div>
...
data () {
return {
how:null
}
}
<input id="user-name" name="user-name" type="text" v-model.trim="userName" @blur="validateInput" />
<input v-model="searchText" />
혹은
<CustomInput v-model="searchText" />
<input
:value="searchText"
@input="searchText = $event.target.value"
/>
혹은
<CustomInput
:modelValue="searchText"
@update:modelValue="newValue => searchText = newValue"
/>
<!-- CustomInput.vue -->
<template>
<input
:value="modelValue"
@input="$emit('update:modelValue', $event.target.value)"
/>
<li :class="{active: modelValue === 'great'}">
<button type="button" @click="activate('great')">Great</button>
</li>
</template>
<script>
export default {
props: ['modelValue'],
emits: ['update:modelValue'],
methods :{
activate(option) {
this.$emit('update:modelValue', option);
},
}
}
</script>
?
조건에 따라 class를 부여하고 싶다면invalid ? userNameValidity === 'invalid' : ''
invalid: userNameValidity === 'invalid'