# Form ๋ค๋ฃจ๊ธฐ
ํผ(Form)์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ฝ๋ ํ์์ ๋๋ค. ๋ก๊ทธ์ธ์ด๋ ์ํ ๊ฒฐ์ ๋ฑ ๋ชจ๋ ๊ณณ์ ์ฌ์ฉ์์ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ ํผ์ด ํ์ํฉ๋๋ค.
# Form ์ ์ํ๊ธฐ
๊ทธ๋ผ ๋ทฐ๋ก ๊ฐ๋จํ ๋ก๊ทธ์ธ ํผ์ ํ๋ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
# 1. HTML ํ๊ทธ ๊ตฌ์ฑ
๋จผ์ ๊ฐ๋จํ HTML ํ๊ทธ๋ถํฐ ์๋์ ๊ฐ์ด ๊ตฌ์ฑํฉ๋๋ค.
<form>
<div>
<label for="email">Email</label>
<input id="email" type="text">
</div>
<div>
<label for="password">Password</label>
<input id="password" type="password">
</div>
<div>
<button type="submit">Login</button>
</div>
</form>
# 2. HTML ํ๊ทธ์ ๋ทฐ ์์ฑ ์ถ๊ฐ
์์์ ์์ฑํ ํผ์ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ๊ตฌํํฉ๋๋ค.
<form v-on:submit.prevent="loginUser">
<div>
<label for="email">Email</label>
<input id="email" type="text" ref="email">
</div>
<div>
<label for="password">Password</label>
<input id="password" type="password" ref="password">
</div>
<div>
<button type="submit">Login</button>
</div>
</form>
๊ฐ ์ธํ ๋ฐ์ค์ ์
๋ ฅ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ref
์์ฑ์ ์ฌ์ฉํ์๊ณ , ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ ์ ๋์ ์ฒ๋ฆฌ๋ฅผ ์ํด v-on:submit
๋๋ ํฐ๋ธ๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. .prevent
๋ ํผ์ ๊ธฐ๋ณธ์ ์ธ ๋์์ ๋ง๊ธฐ ์ํ modifier๋ก์จ ํํ ์ฌ์ฉํ๋ event.preventDefault()
์ฝ๋์ ๊ฐ์ ํจ๊ณผ๋ฅผ ๊ฐ์ง๋๋ค.
# 3. ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ ์ ๋์ ์ฒ๋ฆฌ
๋ก๊ทธ์ธ ๋ฒํผ์ ํด๋ฆญํ๋ฉด loginUser()
๋ฉ์๋๊ฐ ์คํ๋ฉ๋๋ค.
new Vue({
methods: {
loginUser() {
var email = this.$refs.email.value;
var password = this.$refs.password.value;
axios.post('/login', {
email: email,
password: password
});
}
}
})
์ด๋ฉ์ผ๊ณผ ๋น๋ฐ๋ฒํธ ๊ฐ์ ๋ฐ์ HTTP POST ์์ฒญ์ ๋ ๋ ค์ ๋ก๊ทธ์ธ ์ธ์ฆ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
# Form Validation
ํผ์์ ๊ผญ ํด์ค์ผ ํ๋ ์์ ์ ์ฌ์ฉ์์ ์ ๋ ฅ์ด ์ ํจํ์ง ๊ฒ์ฌํ๋ ์์ ์ ๋๋ค. ๋ทฐ์์๋ vee-validate (opens new window) Vuelidate (opens new window) ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํผ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ ์ ์์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์ด์ธ์๋ ๋ทฐ์ ๊ธฐ๋ณธ ์์ฑ์ ํ์ฉํด์ ์๋์ ๊ฐ์ด ๊ฐ๋จํ๊ฒ ์ ํจ์ฑ์ ๊ฒ์ฌํ ์ ์์ต๋๋ค. ์๋์ ๊ฐ์ ๊ฐ๋จํ ์ธํ ๋ฐ์ค๊ฐ ์๋ค๊ณ ํฉ์๋ค.
<div>
<label for="email">email</label>
<input id="email" v-model="email" type="text">
</div>
new Vue({
data: {
email: ''
}
})
์ธํ ๋ฐ์ค์ ์
๋ ฅ ๊ฐ์ ๋ชจ๋ v-model ๋๋ ํฐ๋ธ๋ฅผ ์ด์ฉํ์ฌ email
์ด๋ผ๋ ๋ทฐ ์ธ์คํด์ค ๋ฐ์ดํฐ์ ์ฐ๊ฒฐํฉ๋๋ค.
๋ง์ฝ ์ด ์ธํ ๋ฐ์ค์ ์ต์ 10๊ธ์ ์ด์ ์ ๋ ฅํด์ผ ํ๋ค๋ฉด ์ด๋ป๊ฒ ๊ตฌํํ ์ ์์๊น์?
<div>
<label for="email">email</label>
<input id="email" v-model="email" type="text">
<small>{{ emailValidation }}</small>
</div>
new Vue({
data: {
email: ''
},
computed: {
emailValidation: function() {
return this.email.length > 10 ? `` : `Length must be over 10`;
}
}
})
์์ ๊ฐ์ด ์ผํญ ์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ ๊ธ์๊ฐ 10๊ฐ ์ดํ๋ฉด ๊ณ์ ๊ฒฝ๊ณ ํ์๊ฐ ๋จ๋ computed ์์ฑ์ ๊ตฌํํ๋ฉด ๋ฉ๋๋ค. 10๊ธ์ ์ดํ์ผ ๋๋ ๊ณ์ <small>
ํ๊ทธ ์์ ๊ธ์์ ๊ธธ์ด๊ฐ 10 ์ด์์ด์ด์ผ ํ๋ค๋ ์๋ด ๋ฌธ์๊ฐ ํ์๋ฉ๋๋ค.