반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- react
- Level1
- 리트코드
- 프로그래밍
- 파이썬
- web
- 자바스크립트
- 배열
- 웹프로그래밍
- 리액트
- 동적계획법
- 고득점Kit
- OS
- 프로그래머스
- python
- sql
- 코테연습
- CS
- LeetCode
- 카카오
- typescript
- C++
- dp
- Medium
- VUE
- 백준
- Level2
- Level3
- javascript
- Doitvue.js입문
Archives
- Today
- Total
[Vue] v-model 본문
반응형
v-model
input의 값을 처리하기 위해서 v-bind + v-on한 버전
input의 type에 따라 value 값의 타입을 자동으로 변환해준다.
<input id="age" name="age" type="number" v-model="userAge" ref="ageInput"/>
<script>
export default {
data() {
return {
userName: '',
userage: null,
};
},
methods: {
submitForm() {
console.log(`UserName : ${this.userName}`);
this.userName = '';
console.log('User age:');
console.log(this.userAge + 5); // number
console.log(31);
this.userAge = null;
console.log(this.$refs.ageInput.value + 5); // string
}
}
}
</script>
v-model은 modifier도 제공한다.
lazy
기본적으로 v-model은 각 입력 이벤트 후 입력과 데이터를 동기화하는데 lazy 옵션을 사용하면 change 이벤트 이후에 동기화할 수 있다.
number
value를 number로 변환해줌
(parseFloat()로 변환되지 않는 값일 경우 원래 값을 리턴해줌)
trim
시작과 뒤의 공백을 제거해줌
Custom Form 만들기
v-model
은 v-bind
와 v-on
의 숏컷이기 때문에 props와 emits를 이용하면 커스텀 폼에서도 v-model로 상태 값을 연결할 수 있다.
RatingControl.vue
<template>
<ul>
<li :class="{active : modelValue === 'poor'}">
<button type="button" @click="activate('poor')">Poor</button>
</li>
<li :class="{active : modelValue === 'average'}">
<button type="button" @click="activate('average')">Average</button>
</li>
<li :class="{active : modelValue === 'great'}">
<button type="button" @click="activate('great')">Great</button>
</li>
</ul>
</template>
<script>
export default {
props: ['modelValue'],
emits: ['update:modelValue'],
computed: {
activeOption() {
return this.modelValue;
}
},
methods: {
activate(option) {
this.$emit('update:modelValue', option);
}
}
}
</script>
<style scoped>
.active {
border-color: #a00078;
}
.active button {
color: #a00078;
}
ul {
list-style:none;
margin: 0.5rem 0;
padding: 0;
display: flex;
}
li {
margin: 0 1rem;
border: 1px solid #ccc;
padding: 1rem;
display: flex;
justify-content: center;
align-items: center;
}
button {
font: inherit;
border: none;
background-color: transparent;
cursor: pointer;
}
</style>
TheForm.vue (parent)
<template>
<form @submit.prevent="submitForm">
<div class="form-control" >
<rating-control v-model="rating"></rating-control>
</div>
</form>
</template>
<script>
export default {
components: {
RatingControl,
},
data() {
return {
userName: '',
userage: null,
referrer: 'wom',
interest: [],
how: null,
confirm: false,
userNameValidity: 'pending',
rating: null,
};
},
<script>
반응형
'Web > Vue' 카테고리의 다른 글
[Vue] Router (0) | 2022.09.13 |
---|---|
[Vue] Vuex (0) | 2022.09.13 |
[Vue] 뷰 CLI에서 사용하는 NPM (0) | 2022.08.08 |
[Vue] Vuex, 뷰의 반응성, SSR, 뷰 개발을 위한 웹 팩 (0) | 2022.08.08 |
[Vue] 뷰 Todo 애플리케이션 만들기 - 2 (0) | 2022.08.05 |
Comments