Vue

๐Ÿ… vee-validate ์ ์šฉ

frontChoi 2022. 8. 7. 12:01
๋ฐ˜์‘ํ˜•

๐ŸŽvee-validate?

vee-validate๋Š” vue์—์„œ validation์„ ํŽธํ•˜๊ฒŒ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์— ์ ์šฉ์‹œ์ผœ๋ณด์•˜๋‹ค. ๊ทธ ์ „์—๋Š” script์— ๊ต‰์žฅํžˆ if~else๊ฐ€ ๋งŽ์•„์„œ ์œ ์ง€๋ณด์ˆ˜์— ๊ต‰์žฅํ•œ ์–ด๋ ค์›€์ด ์žˆ์—ˆ๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ ๊ฐ„๋‹จํ•œ validation์„ ์†Œ๊ฐœ์‹œ์ผœ ์ฃผ๊ณ ์ž ํ•œ๋‹ค.

 

๐Ÿ‘Œvee-validate ์„ธํŒ…

https://github.com/eorjs37/vue3_vee_validate  ์€ ์—ฌ๊ธฐ์„œ ์„ธํŒ…ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿฃ Form์œผ๋กœ validation ์ฒดํฌ ํ•˜๊ธฐ

๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

ํฌ๊ฒŒ "Form" ์ปดํผ๋„ŒํŠธ์œผ๋กœ ๊ฐ์‹ธ๊ณ  "Form" ์•ˆ์—  "Field" ์ปดํผ๋„ŒํŠธ๋ฅผ ๋„ฃ๋Š”๋‹ค.

Form

์œ„ ๊ตฌ์กฐ๋ฅผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.(์ฐธ๊ณ ๋กœ 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๋ฅผ ํ†ตํ•ด ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค 

required ์ ์šฉ

 

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" ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•„์ˆ˜๊ฐ’์ด๋ฉด์„œ ์ด๋ฉ”์ผ์„ ์ฒดํฌํ•˜๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค.

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๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ํ›จ์”ฌ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์‰ฌ์›Œ์กŒ๋‹ค. ์‹ค์ œ ์‹ค๋ฌด์—์„œ๋Š” ์ด๊ฒƒ๋ณด๋‹ค๋Š” ํ›จ์”ฌ ๋ณต์žกํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ํ•„์š”ํ•ด ๋ณด์ธ๋‹ค.

๋ฐ˜์‘ํ˜•