๐ vee-validate ์ ์ฉ
๐vee-validate?
vee-validate๋ vue์์ validation์ ํธํ๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ด๋ฒ ํ๋ก์ ํธ์ ์ ์ฉ์์ผ๋ณด์๋ค. ๊ทธ ์ ์๋ script์ ๊ต์ฅํ if~else๊ฐ ๋ง์์ ์ ์ง๋ณด์์ ๊ต์ฅํ ์ด๋ ค์์ด ์์๋ค. ๊ทธ๋ฆฌํ์ฌ ๊ฐ๋จํ validation์ ์๊ฐ์์ผ ์ฃผ๊ณ ์ ํ๋ค.
๐vee-validate ์ธํ
https://github.com/eorjs37/vue3_vee_validate ์ ์ฌ๊ธฐ์ ์ธํ ํ๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
๐ฃ Form์ผ๋ก validation ์ฒดํฌ ํ๊ธฐ
๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.
ํฌ๊ฒ "Form" ์ปดํผ๋ํธ์ผ๋ก ๊ฐ์ธ๊ณ "Form" ์์ "Field" ์ปดํผ๋ํธ๋ฅผ ๋ฃ๋๋ค.
์ ๊ตฌ์กฐ๋ฅผ ์ฝ๋๋ก ์์ฑํ๋ฉด ์๋์ ๊ฐ๋ค.(์ฐธ๊ณ ๋ก css๋ ์์ ์ ํธํ๊ธฐ ํ๊ธฐ ์ํด boostrap๋ฅผ ์ ์ฉํ์๋ค.)
์๋์ฝ๋์์๋ Field๊ฐ ํ๋๋ฟ์ด์ง๋ง ๋๋ฌด ๋ง์ด ๋ฃ์ผ๋ฉด ๋ณด๊ธฐ ํ๋ค์ด ํ์ฌ๋ ํ๊ฐ๋ง ๋ฃ์๋ค.
<template>
<div class="container mt-3">
//Form ํ๊ทธ
<Form @submit="form.onSubmit" ref="addForm">
<b-row>
<b-col lg="6" sm="12">
<Field v-model="form.name" id="name" name="name" label="์ด๋ฆ" rules="required" v-slot="{ field, errors }">
<b-form-group id="name" label="์ด๋ฆ" label-for="name">
<b-form-input id="name" v-bind="field" type="text" placeholder="์ด๋ฆ์ ์
๋ ฅํ์ธ์." :state="errors[0] ? false : null"> </b-form-input>
<b-form-invalid-feedback v-if="errors[0]" id="input-live-feedback"> {{ errors[0] }} </b-form-invalid-feedback>
</b-form-group>
</Field>
</b-col>
</b-row>
</Form>
<div>
</template>
<script>
import { reactive, ref } from 'vue';
export default {
setup() {
//Form ์ฐธ์กฐํ๊ธฐ ์ํด ์ ์ธ
const addForm = ref(null);
const form = reactive({
name: '',
onSubmit: async () => {
//validate๊ฐ promise์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ async/await๋ฅผ ์ฌ์ฉํ์๋ค.
const { validate } = addForm.value;
const { valid } = await validate();
if (!valid) {
alert('ํ์๊ฐ์ ํ์ธํด์ฃผ์ธ์.');
}
},
})
return {
addForm,
form,
};
}
}
๐ vee-validate rules ์ ์ฉ
vee-validate์๋ ๋ง์ rule์ด ์๋ค. ์ฌ๊ธฐ์ ์ ์ฉํ๊ฑด "required(ํ์๊ฐ), email(์ด๋ฉ์ผ ์์ ํ์ธ), comfirmed(๋น๋ฐ๋ฒํธ ํ์ธ)" ์ ์ฉํ์๋ค.
vee-validate rules : vee-validate๋ค์ํ rules ํ์ธ
1. required ์ ์ฉ
<Field v-model="form.name" id="name" name="name" label="์ด๋ฆ" rules="required" v-slot="{ field, errors }">
<b-form-group id="name" label="์ด๋ฆ" label-for="name">
<b-form-input id="name" v-bind="field" type="text" placeholder="์ด๋ฆ์ ์
๋ ฅํ์ธ์." :state="errors[0] ? false : null"> </b-form-input>
<b-form-invalid-feedback v-if="errors[0]" id="input-live-feedback"> {{ errors[0] }} </b-form-invalid-feedback>
</b-form-group>
</Field>
rules="required" ๋ฅผ ํตํด ํ์๊ฐ์ ์ฒดํฌ ํ ๋ค์ label="์ด๋ฆ" ๋ฅผ ํตํด ํญ๋ชฉ์ ์๋ฌ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ค๋ค. validate๋ฅผ ํ์๋๋ ์๋์ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ errors๋ฅผ ํตํด ๋ฉ์ธ์ง๋ฅผ ๋ณด์ฌ์ค๋ค
2. email ์ ์ฉ
<b-col lg="6" sm="12">
<Field v-model="form.email" id="email" name="email" label="์ด๋ฉ์ผ" rules="required|email" v-slot="{ field, errors }">
<b-form-group id="email" label="Email address" label-for="email">
<b-form-input
id="email"
v-bind="field"
type="email"
placeholder="Enter email"
:state="errors[0] ? false : null"
required></b-form-input>
<b-form-invalid-feedback v-if="errors[0]" id="input-live-feedback"> {{ errors[0] }} </b-form-invalid-feedback>
</b-form-group>
</Field>
</b-col>
์ฌ๊ธฐ์๋ rules="required|email" ๋ฅผ ์ฌ์ฉํ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ์๊ฐ์ด๋ฉด์ ์ด๋ฉ์ผ์ ์ฒดํฌํ๊ฒ ๋ค๋ ๋ป์ด๋ค.
3. confirmed
confirmed๋ ๋น๋ฐ๋ฒํธ ํ์ธ๊ฐ์ ํ์ธํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. ์ฌ์ฉ๋ฐฉ๋ฒ ์ฝ๋๋ ์๋์ ๊ฐ๋ค
<b-row>
<b-col lg="6" sm="12">
<Field v-model="form.password" id="password" name="password" label="๋น๋ฐ๋ฒํธ" rules="required" v-slot="{ field, errors }">
<b-form-group id="password" label="๋น๋ฐ๋ฒํธ" label-for="password">
<b-form-input
id="password"
type="password"
placeholder="Enter password"
:state="errors[0] ? false : null"
v-bind="field"></b-form-input>
<b-form-invalid-feedback v-if="errors[0]" id="input-live-feedback"> {{ errors[0] }} </b-form-invalid-feedback>
</b-form-group>
</Field>
</b-col>
<b-col lg="6" sm="12">
<Field
v-model="form.passwordConfirm"
id="passwordConfirm"
name="passwordConfirm"
label="๋น๋ฐ๋ฒํธ"
rules="required|confirmed:@password"
v-slot="{ field, errors }">
<b-form-group id="passwordConfirm" label="๋น๋ฐ๋ฒํธ" label-for="passwordConfirm">
<b-form-input
id="passwordConfirm"
type="password"
placeholder="Enter passwordConfirm"
v-bind="field"
:state="errors[0] ? false : null"></b-form-input>
<b-form-invalid-feedback v-if="errors[0]" id="input-live-feedback"> {{ errors[0] }} </b-form-invalid-feedback>
</b-form-group>
</Field>
</b-col>
</b-row>
์ฌ๊ธฐ์ rules="required|confirmed:@password" ์ ๋ป์ "ํ์๊ฐ AND name:password์ ๊ฐ์ ์ผ์งํ๋์ง ํ์ธํจ" ์ด๋ผ๋ ๋ป์ด๋ค.
๐ฆ ํ๊ธฐ
์ด๋ฒ ํ๋ก์ ํธ์ ์ ์ฉํ ๊ฒฐ๊ณผ ์ ์ง๋ณด์ ๊ด์ ์์ ๋ณด๋ฉด if~else๋ฅผ ๋ฐ๋ณตํ๋ ๊ฒ ๋ณด๋ค๋ ํจ์ฌ ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ฌ์์ก๋ค. ์ค์ ์ค๋ฌด์์๋ ์ด๊ฒ๋ณด๋ค๋ ํจ์ฌ ๋ณต์กํ๋ฉฐ, ๋ค์ํ ์ํฉ์ ๋ํ ๊ฒฝํ์ด ํ์ํด ๋ณด์ธ๋ค.