Form Handling
1. Capture user inputs
<template>
<div>
<pre>
{{ JSON.stringify(formValues, null, 2) }}
</pre>
</div>
<form>
<div>
<label for="name">Name</label>
<input type="text" id="name" v-model="formValues.name" />
</div>
</form>
</template>
<script>
export default {
data() {
return {
formValues: {
name: "",
},
};
},
};
</script>
2. Inputs, Textareas
<template>
<div>
<pre>
{{ JSON.stringify(formValues, null, 2) }}
</pre>
</div>
<form @submit="sumitForm">
<div>
<label for="name">Name</label>
<input type="text" id="name" v-model="formValues.name" />
</div>
<div>
<label for="profile">Profile Summary</label>
<textarea id="profile" v-model="formValues.profileSummary" />
</div>
</form>
</template>
<script>
export default {
data() {
return {
formValues: {
name: "",
Profile: "",
},
};
},
};
</script>
3. Single select dropdown control
<template>
<div>
<pre>
{{ JSON.stringify(formValues, null, 2) }}
</pre>
</div>
<form>
<div>
<label for="country">Country</label>
<select id="country" v-model="formValues.country">
<option value="india">india</option>
<option value="vietnam">vietnam</option>
<option value="singapore">singapore</option>
</select>
</div>
</form>
</template>
<script>
export default {
data() {
return {
formValues: {
country: "",
},
};
},
};
</script>
3. Multi select control
multiple옵션을 추가해주면 여러개 선택이 가능하다.
ctrl, shift 키랑 같이 눌러주면 복수 선택되어진다.
<template>
<div>
<pre>
{{ JSON.stringify(formValues, null, 2) }}
</pre>
</div>
<form>
<div>
<label for="job-location">JOB Location</label>
<select multiple id="job-location" v-model="formValues.jobLocation">
<option value="india">india</option>
<option value="vietnam">vietnam</option>
<option value="singapore">singapore</option>
</select>
</div>
</form>
</template>
<script>
export default {
data() {
return {
formValues: {
jobLocation: [],
},
};
},
};
</script>
4. Checkbox
ture-value, false-value를 이용해서 토글데이터에 입력되는 값을 지정해 줄 수 있다.
<template>
<div>
<pre>
{{ JSON.stringify(formValues, null, 2) }}
</pre>
</div>
<form>
<!--
<div>
<label for="remoteWork">Open to remote work?</label>
<input type="checkbox" id="remoteWork" v-model="formValues.remoteWork" />
</div>
-->
<div>
<label for="remoteWork">Open to remote work?</label>
<input
type="checkbox"
id="remoteWork"
v-model="formValues.remoteWork"
true-value="yes"
false-value="no"
/>
</div>
</form>
</template>
<script>
export default {
data() {
return {
formValues: {
remoteWork: false,
},
};
},
};
</script>
5. Checkbox group
여러개 선택시 data에 배열로 초기화 해준다.
<template>
<div>
<pre>
{{ JSON.stringify(formValues, null, 2) }}
</pre>
</div>
<form>
<div>
<label>Skill</label>
<input
type="checkbox"
id="html"
value="html"
v-model="formValues.skillSet"
/>
<label for="javascript">html</label>
<input
type="checkbox"
id="javascript"
value="javascript"
v-model="formValues.skillSet"
/>
<label for="javascript">javascript</label>
<input
type="checkbox"
id="css"
value="css"
v-model="formValues.skillSet"
/>
<label for="javascript">css</label>
</div>
<div>
</form>
</template>
<script>
export default {
data() {
return {
formValues: {
skillSet: [],
},
};
},
};
</script>
6. Radio
<template>
<div>
<pre>
{{ JSON.stringify(formValues, null, 2) }}
</pre>
</div>
<form>
<div>
<h2>years of experience</h2>
<input
type="radio"
id="0-2"
value="0-2"
v-model="formValues.yearOfExperience"
/>
<label for="0-2">0-2</label>
<input
type="radio"
id="3-5"
value="3-5"
v-model="formValues.yearOfExperience"
/>
<label for="3-5">3-5</label>
<input
type="radio"
id="5-10"
value="5-10"
v-model="formValues.yearOfExperience"
/>
<label for="5-10">5-10</label>
</div>
</form>
</template>
<script>
export default {
data() {
return {
formValues: {
yearOfExperience: "",
},
};
},
};
</script>
7. Submit form data
<template>
<div>
<pre>
{{ JSON.stringify(formValues, null, 2) }}
</pre>
</div>
<form @submit="sumitForm">
<div>
<label for="name">Name</label>
<input type="text" id="name" v-model="formValues.name" />
</div>
<div>
<label for="Profile">Profile Summary</label>
<input type="text" id="Profile" v-model="formValues.Profile" />
</div>
<div>
<label for="country">Country</label>
<select id="country" v-model="formValues.country">
<option value="india">india</option>
<option value="vietnam">vietnam</option>
<option value="singapore">singapore</option>
</select>
</div>
<div>
<label for="job-location">JOB Location</label>
<select multiple id="job-location" v-model="formValues.jobLocation">
<option value="india">india</option>
<option value="vietnam">vietnam</option>
<option value="singapore">singapore</option>
</select>
</div>
<div>
<label for="remoteWork">Open to remote work?</label>
<input
type="checkbox"
id="remoteWork"
v-model="formValues.remoteWork"
true-value="yes"
false-value="no"
/>
</div>
<div>
<label>Skill</label>
<input
type="checkbox"
id="html"
value="html"
v-model="formValues.skillSet"
/>
<label for="javascript">html</label>
<input
type="checkbox"
id="javascript"
value="javascript"
v-model="formValues.skillSet"
/>
<label for="javascript">javascript</label>
<input
type="checkbox"
id="css"
value="css"
v-model="formValues.skillSet"
/>
<label for="javascript">css</label>
</div>
<div>
<h2>years of experience</h2>
<input
type="radio"
id="0-2"
value="0-2"
v-model="formValues.yearOfExperience"
/>
<label for="0-2">0-2</label>
<input
type="radio"
id="3-5"
value="3-5"
v-model="formValues.yearOfExperience"
/>
<label for="3-5">3-5</label>
<input
type="radio"
id="5-10"
value="5-10"
v-model="formValues.yearOfExperience"
/>
<label for="5-10">5-10</label>
</div>
<button>submit</button>
</form>
</template>
<script>
export default {
data() {
return {
formValues: {
name: "",
Profile: "",
country: "",
jobLocation: [],
remoteWork: false,
skillSet: [],
yearOfExperience: "",
},
};
},
methods: {
sumitForm(event) {
event.preventDefault();
console.log(this.formValues);
},
},
};
</script>
<style scoped>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
/* text-align: center; */
color: #2c3e50;
margin-top: 60px;
}
.underline {
text-decoration: underline;
}
.promoted {
font-style: italic;
}
.new {
color: olivedrab;
}
.sold-out {
color: red;
}
label {
font-weight: bold;
display: flex;
margin-bottom: 5px;
}
input + label {
font-weight: bold;
display: inline-flex;
margin-right: 20px;
}
input[type="text"],
textarea,
select {
display: block;
width: 400px;
padding: 6px 12px;
font-size: 14px;
line-height: 1.42857143;
color: #555;
background-color: #fff;
background-image: none;
border: 1px solid #ccc;
border-radius: 4px;
}
</style>
[v-model Modifier]
주로 form에 데이터 바인딩에 사용한다.
기존의 React에서는 input에 value 값을 핸들링 하기 위해선 inputHandle이라는 함수를 만들어 event의 target value를 가져와 state에 연결하는 형식으로 인풋을 컨트롤 했었다면, vue에서는 v-model에 연결 시켜 줌으로써 양방향 데이터 바인딩이 가능해진다.
v-model.trim
input으로 받은 문자열을 자동으로 공백과 개행을 없애주는 수식어이다.
v-model.lazy
<label for="name">Name</label>
<input type="text" id="name" v-model.trim.lazy="formValues.name" />
입력할 때마다 변경되는 것 말고 다 입력한 후에 변경하고 싶으면 수식어로 ".lazy" 붙여준다.
입력되는 모든 키에 대한 바인딩이 되지 않기 때문에 성능 향상에 도움이 된다.
input이 아닌 change이벤트 후에 데이터가 연동되도록 하는 수식어이다.
v-model.input
input으로 받는 숫자는 문자열이 아닌, int type의 데이터로 들어가게 하는 수식어 이다.
v-model.number
<label for="age"></label>
<input id="age" type="text" v-model.number="formValues.age" />
@sumit.prevent=""
v-on:submit.prevent
폼의 기본적인 동작을 막기 위한 modifier로써 흔히 사용하는 event.preventDefault()와 같은 효과
@keyup.enter
v-on:keyup.enter
enter키를 눌렀을 때 이벤트 발생한다.
아래 button submit이 따로 필요하지 않게 되는 상황
<input @keyup="printEvent('keyup')" // 키보드의 키를 눌렀다 뗐을 때
@keydown="printEvent('keydown')" // 키보드의 키를 눌렀을 때
@keypress="printEvent('keypress')" // 키보드의 키를 누르고 있을 때
v-model="name" />
<input @keyup.tap="printEvent('keyup')" // tap키를 눌렀다 뗐을 때
@keydown.space="printEvent('keydown')" // space키를 눌렀을 때
@keypress.left="printEvent('keypress')" // left 키를 누르고 있을 때
v-model="name" />
data () {
return {
name: ''
}
},
methods: {
printEvent (val) {
console.log(val)
}
}
'Framework > vue_Foundation' 카테고리의 다른 글
wathcer (vue.js) (0) | 2023.01.05 |
---|---|
computed properties (vue.js) (0) | 2023.01.05 |
Event handling(vue) (0) | 2023.01.05 |
v-for Directive (0) | 2023.01.05 |
Conditional Rendering(v-if, v-show) (0) | 2023.01.05 |
댓글