이 영역을 누르면 첫 페이지로 이동
나눔코딩 블로그의 첫 페이지로 이동

나눔코딩

페이지 맨 위로 올라가기

나눔코딩

20. Vue2 - 유효성 검사 모듈 Vee Validation ^3.4.11

  • 2021.11.16 00:43
  • 16. Vue JS/Vue 2
  OS   Windows 10 PRO 64bit 버전 20H2 (OS 빌드 19042.867)
  Vue   2.5.13
  Vee Validation   ^3.4.11

 

공식 홈

https://vee-validate.logaretm.com/v4/v4/guide/global-validators#defining-global-validators

 

모듈 설치
npm install vee-validate@3.4.11

프로젝트명과 같은 경우 설치 오류가 발생할 수 있습니다

 

Vue 전역 컴포넌트로 등록 + extend 활용
vee-validation.js
import Vue from 'vue';
import { extend, ValidationObserver, ValidationProvider } from 'vee-validate';
import {
  required,
  digits,
  numeric,
  email,
  confirmed,
} from 'vee-validate/dist/rules';

extend('limit', (value, params) => {
  const [min, max] = params;
  if ((value && value.length < min) || value.length > max) {
    return `{_field_} 필드는 ${min}자 ~ ${max}자를 초과할 수 없습니다`;
  }
  return true;
});

extend('required', {
  ...required,
  message: '{_field_} 필드는 반드시 입력해야 합니다',
});

extend('required-select', {
  ...required,
  message: '{_field_} 필드는 반드시 선택해야 합니다',
});

extend('numeric', {
  ...numeric,
  message: '{_field_} 필드는 숫자로만 구성되어야 합니다',
});
extend('digits', {
  ...digits,
  message: '{_field_} 필드는 11자리 여야 합니다',
});

extend('email', {
  ...email,
  message: '잘못 입력된 이메일 주소 입니다',
});

// provider 에 :rules="{ confirmed: 'provider name 명을 적어주면 된다'}"
extend('confirmed', {
  ...confirmed,
  message: '비밀번호와 비밀번호확인이 일치하지 않습니다',
});

Vue.component('ValidationObserver', ValidationObserver);
Vue.component('ValidationProvider', ValidationProvider);

 

작성된 모듈 사용하기
main.js
import Vue from 'vue';
import App from './App.vue';
import '@/plugin/vee-validation';

Vue.config.productionTip = false;

new Vue({
  render: (h) => h(App),
}).$mount('#app');

 

페이지

이메일 validation

SignUpPage.vue
<template>
  <div>
    <h1>싱글 페이지</h1>

    <form >
      <validation-provider
        rules="email"
        name="이메일"
        v-slot="{errors}"
      >
        <div>
          <label>이메일</label>
          <input v-model="formData.email" type="text" name="이메일" value="">
        </div>
        <div>
          {{errors}}
        </div>
      </validation-provider>

    </form>
  </div>
</template>

<script>
export default {
  name: 'SignUpPage',
  data() {
    return {
      formData: {
        email: '',
      },
    };
  },

};
</script>

<style scoped>
div {
  margin-bottom: 8px;
}

</style>

- rules 는 이 필드에서 유효성을 검사할 항목들을 지정한다
  vee-validation.js 에서 extend 로 정의했던 유효성을 사용할 수 있으며, 또는 직접 method 로 유효성검사를 할 수 있다

- name 은 에러가 발생했을 때 `_field` 명의 기본 명칭을 정의해주기 위해 사용된다 - 예시) OO필드는 필수 입니다

- v-slot 은 해당 컴포넌트의 slot 부분을 가져오기 위해 사용하였다

 

버튼을 통한 invalid 체크

버튼을 통한 validation

<template>
  <div>
    <h1>싱글 페이지</h1>

    <form @submit.prevent="submit">
      <validation-provider
        ref="emailProvider"
        rules="required|email"
        name="이메일"
        v-slot="{errors}"
      >
        <div>
          <label>이메일</label>
          <input v-model="formData.email" type="text" name="이메일" value="">
        </div>
        <div>
          {{errors}}
        </div>
      </validation-provider>

      <button>버튼</button>

    </form>
  </div>
</template>

<script>
export default {
  name: 'SignUpPage',
  data() {
    return {
      formData: {
        email: '',
      },
    };
  },

  methods: {
    submit() {
      const { emailProvider } = this.$refs;
      console.log(emailProvider);

      emailProvider.validate().then((result) => {
        console.log(result);
        if (result.valid) console.log('post api');
        else console.error('form invalid');
      });
    },
  },
};
</script>

<style scoped>
div {
  margin-bottom: 8px;
}

</style>

&amp;lt;validation-prodiver&amp;gt; 속성 - 1
&amp;lt;validation-prodiver&amp;gt; 속성 - 2

<validation-prodiver> 를 통하여 해당 필드명, 입력했던 값, 현재 에러내용, flag 내용을 알 수 있으며, validation() 함수를 호출하여 새롭게 유효성 검사 체크를 할 수 있다

 

v-slot 의 내용들은 validation() 함수를 통해 얻어는 결과가 담겨져있으며, v-slot="{errors}" 를 사용하여 에러 배열 부분만 가져와 사용하였다

 

v-data 를 통한 rules 방식

<template>
  <div>
    <h1>싱글 페이지</h1>

    <form @submit.prevent="submit">
      <validation-provider
        ref="emailProvider"
        :rules="validateCheck"
        name="이메일"
        v-slot="{errors}"
      >
        <div>
          <label>이메일</label>
          <input v-model="formData.email" type="text" name="이메일" value="">
        </div>
        <div>
          {{errors}}
        </div>
      </validation-provider>

      <button>버튼</button>

    </form>
  </div>
</template>

<script>
export default {
  name: 'SignUpPage',
  data() {
    return {
      formData: {
        email: '',
      },
      validateCheck: {
        required: true,
        email: true,
        limit: [1, 11],
      },
    };
  },

  methods: {
    submit() {
      const { emailProvider } = this.$refs;
      console.log(emailProvider);

      emailProvider.validate().then((result) => {
        console.log(result);
        if (result.valid) console.log('post api');
        else console.error('form invalid');
      });
    },
  },
};
</script>

<style scoped>
div {
  margin-bottom: 8px;
}

</style>

- required 는 필수 입력

- email 은 이메일 형식

- limit 은 min 과 max 를 의미한다

 

- 다른 방식으로 아래와 같이 할 수 있다

<validation-provider
        ref="emailProvider"
        :rules="{
        required: true,
        email: true,
        limit: [1, 14],
        }"
        name="이메일"
        v-slot="{errors}"
>
        <div>
          <label>이메일</label>
          <input v-model="formData.email" type="text" name="이메일" value="" autocomplete="off">
        </div>
        <div>
          {{errors}}
        </div>
</validation-provider>

 

<validation-provider
        ref="emailProvider"
        rules="required|email|limit:1,14"
        name="이메일"
        v-slot="{errors}"
      >
        <div>
          <label>이메일</label>
          <input v-model="formData.email" type="text" name="이메일" value="" autocomplete="off">
        </div>
        <div>
          {{errors}}
        </div>
</validation-provider>

 

여러 컴포넌트 적용해보기

전체 유효성 검사

<template>
  <div>
    <h1>싱글 페이지</h1>
    <validation-observer ref="validator">
      <form @submit.prevent="submit">
        <validation-provider
          rules="required|email|limit:1,14"
          name="이메일"
          v-slot="{errors}"
        >
          <div>
            <label>이메일</label>
            <input v-model="formData.email" type="text" name="이메일" value=""
                   autocomplete="off">
          </div>
          <div>
            {{ errors }}
          </div>
        </validation-provider>

        <validation-provider rules="required" name="패스워드" v-slot="{errors}">
          <div>
            <label>비밀번호</label>
            <input v-model="formData.password" type="text" name="" value="">
          </div>
          <div>
            {{ errors }}
          </div>
        </validation-provider>

        <validation-provider rules="required|confirmed:패스워드" name="패스워드확인"
                             v-slot="{errors}">
          <div>
            <label>비밀번호 확인</label>
            <input v-model="formData.passwordCheck" type="text" name=""
                   value="">
          </div>
          <div>
            {{ errors }}
          </div>
        </validation-provider>

        <validation-provider rules="required" name="휴대폰" v-slot="{errors}">
          <div>
            <label>휴대폰</label>
            <input v-model="formData.tell" type="text" name="" value="">
          </div>
          <div>
            {{ errors }}
          </div>
        </validation-provider>

        <!-- v-model 에서 '' 또는 null 로 기본값으로 세팅해주어야 함, false 로 할 경우 required 먹히지 않음 -->
        <validation-provider rules="required" name="성별" v-slot="{errors}">
          <div>
            <label>성별</label>

            <input v-model="formData.gender" type="radio" name="gender"
                   value="1">
            <label>남</label>
            <input v-model="formData.gender" type="radio" name="gender"
                   value="2">
            <label>여</label>
          </div>
          <div>
            {{ errors }}
          </div>
        </validation-provider>

        <validation-provider rules="required-select" name="취미" v-slot="{errors}">
          <div>
            <label>취미</label>
            <input v-model="formData.hobby" type="checkbox" name="hobby"
                   value="A">
            <label>A</label>
            <input v-model="formData.hobby" type="checkbox" name="hobby"
                   value="B">
            <label>B</label>
            <input v-model="formData.hobby" type="checkbox" name="hobby"
                   value="C">
            <label>C</label>
          </div>
          <div>
            {{ errors }}
          </div>
        </validation-provider>

        <button>버튼</button>
      </form>
    </validation-observer>

  </div>
</template>

<script>
export default {
  name: 'SignUpPage',
  data() {
    return {
      formData: {
        email: '',
        password: '',
        passwordCheck: '',
        tell: '',
        gender: '',
        hobby: [],
      },
    };
  },

  methods: {
    submit() {
      const { validator } = this.$refs;
      console.log(validator);

      validator.validate().then((result) => {
        console.log(result);
        if (result.valid) console.log('post api');
        else console.error('form invalid');
      });
    },
  },
};
</script>

<style scoped>
div {
  margin-bottom: 8px;
}

</style>
저작자표시 (새창열림)

'16. Vue JS > Vue 2' 카테고리의 다른 글

19. Vue2 - Vuex 데이터 관리방법  (0) 2021.10.01
17. Vue2 - @Input  (0) 2021.07.25
16. Vue 2 - Vuex Module 분리하기  (0) 2021.04.20
15. Vue 2 - Axios interceptor Loading Spinner  (0) 2021.04.02
14. Vue 2 - Vue Storybook  (0) 2021.03.31

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 19. Vue2 - Vuex 데이터 관리방법

    19. Vue2 - Vuex 데이터 관리방법

    2021.10.01
  • 17. Vue2 - @Input

    17. Vue2 - @Input

    2021.07.25
  • 16. Vue 2 - Vuex Module 분리하기

    16. Vue 2 - Vuex Module 분리하기

    2021.04.20
  • 15. Vue 2 - Axios interceptor Loading Spinner

    15. Vue 2 - Axios interceptor Loading Spinner

    2021.04.02
다른 글 더 둘러보기

정보

나눔코딩 블로그의 첫 페이지로 이동

나눔코딩

  • 나눔코딩의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (316)
    • ∞. 읽은 거리 (3)
    • ∞. 기술 면접 (61)
      • 1. 자료구조 (0)
      • 2. 네트워크 (9)
      • 3. 운영체제 (11)
      • 4. 데이터베이스 (13)
      • 5. 디자인 패턴 (0)
      • 6. 알고리즘 (0)
      • 7. 자바 (15)
      • 8. 자바스크립트 (7)
      • 9. 스프링 (5)
      • 10. 시큐리티 (1)
      • 11. 기타 (0)
      • 12. Vue (0)
    • ∞. 웹개발 유용한 사이트 (14)
    • ∞. 트러블 슈팅 + TIL (7)
    • 00. 출발 (9)
    • 01. 엑셀 (9)
      • 기초 (4)
      • 컴활 1급 (4)
      • VBA (0)
    • 02. 엑세스 (9)
      • 기초 (5)
      • 컴활 1급 (4)
    • 04. Oracle (1)
      • 기초 (1)
    • 03. JAVA (8)
      • 기초 (7)
      • 객체지향 프로그래밍 (0)
    • 05. HTML (13)
      • 기초 (1)
      • css (10)
      • sass (0)
      • less (0)
    • 06. Javascript (16)
      • 기초 (13)
      • ES6 모듈 (2)
      • Canvas (0)
    • 07. JSP (0)
      • 기초 (0)
    • 08. jQuery (0)
      • 기초 (0)
    • 09. BootStrap (1)
      • 기초 (0)
      • v4 - Layout (1)
    • 10. Spring (30)
      • 기초 (3)
      • 실험 (4)
      • MVC (1)
      • BOOT (6)
      • Security (10)
      • Lib (Library) (2)
      • 벤치마킹 (0)
      • JUnit5 (2)
      • DevTools (0)
      • Socket (1)
      • Batch (0)
      • Mobile (0)
      • WebFlux (0)
      • Cloud (0)
      • Thymleaf (0)
      • Actuator (0)
      • 성능 테스트 (1)
    • 11. JetBrains (34)
      • 기초 (1)
      • IntelliJ IDEA (33)
      • WebStorm (0)
      • Pycham (0)
    • 12. API (0)
      • 기초 (0)
      • 네이버 API (0)
      • 카카오 API (0)
      • 구글 API (0)
      • 인스타그램 API (0)
    • 13. AutoHotkey (1)
    • 14. Python (8)
      • 기초 (3)
      • Selenium (2)
      • Beautiful Soup (0)
      • openpyxl (1)
      • Pyqt5 (0)
      • Deep learning (open CV) (0)
      • Geocoder (0)
      • Anaconda (0)
      • DeepLearning (0)
      • Jupyter Nootbook (0)
    • 14.5. R (0)
    • 15. JMeter (0)
      • 다운로드 (0)
    • 16. Vue JS (23)
      • 기초 (3)
      • Vue 2 (15)
      • Vue 3 (5)
      • Vuetify 2.5.8 (0)
    • 17. Git (12)
      • 기초 (8)
      • ItelliJ IDEA (4)
      • SourceTree (0)
    • 18. AWS (5)
      • 기초 (2)
      • Jira (3)
    • 19. Naver Cloud Platform (0)
    • 20. Google Cloud Platform (0)
      • 기초 (0)
      • stt & tts (0)
    • 21. Kotlin (0)
    • 22. Android (0)
      • 기초 (0)
      • Java (0)
      • Kotlin (0)
      • Flutter FrameWork (0)
    • 23. Clean Code [JAVA] (1)
    • 24. BuildTool (1)
      • Maven (1)
      • Gradle (0)
    • 25. 자료 구조와 알고리즘 (18)
      • JAVA (1)
      • Java Script (1)
      • 프로그래머스 (0)
      • 백준 알고리즘 (0)
      • 나의 알고리즘 (14)
      • Brilliant 공부 (0)
    • 26. React (1)
      • 기초 (0)
      • 강의 정리 (1)
    • 27. PostMan (0)
      • 기초 (0)
    • 28. 프로그래머스 (9)
    • 29. Leet Code (0)
    • 30. MySQL (3)
      • 기초 (2)
      • 문제 (1)
    • 73. GraphQL (0)
    • 74. Nuxt JS (0)
    • 75. Electron (0)
    • 76. UX &amp; UI Design Tool (0)
      • 기초 (0)
      • Axure (0)
      • Sketch (0)
      • Figma (0)
    • 77. MarkDown (1)
      • 기초 (1)
    • 78. Tomcat (1)
      • 메모 (1)
    • 79. Element JS (0)
    • 80. Parallax JS (0)
      • 기초 (0)
    • 81. Player JS (0)
      • 기초 (0)
    • 82. Smart Maker (0)
    • 83. Vim (0)
      • 기초 (0)
    • 84. Linux (0)
      • 기초 (0)
      • Centos 7 (0)
      • Ubuntu (0)
    • 85. Node JS (2)
      • 기초 (1)
      • WebRTC (0)
      • NVM (1)
    • 86. Propeller JS (0)
    • 87. FullPage JS (0)
      • 기초 (0)
    • 88. 아두이노 (0)
    • 89. Tensorflow (0)
    • 90. 웹 패킷 분석 (0)
    • 91. 크롬 개발자도구 (0)
    • 92. 디자인 패턴 (7)
      • 생성(Creational) (3)
      • 구조(Structral) (1)
      • 행위(Behavioral) (2)
      • SOLID 패턴 (0)
    • 95. Linux Shell Script (0)
    • 96. 구글 애널리스틱 (0)
    • 97. ffmpeg (0)
    • 98. ShareX (1)
    • 자료실 (0)
    • 기타 (2)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 엑셀 표시형식
  • 엑셀 기본작업
  • 엑셀 글씨
  • 엑셀 가운데맞춤
  • 엑셀 기타작업
  • 엑셀 분석작업
  • 깁
  • 졵

나의 외부 링크

  • 비전공자 개발자
  • 자바 디자인 패턴
  • 자바 디자인 패턴
  • 스프링 블로그
  • 해킹보안 & 웹 관련
  • ERD 생성
  • 전문 기술 블로그
  • Servlet에 대한 개념없이 스프링을 했네요?
  • 스프링 FitlerChainList
  • 알고리즘 파워 블로그

정보

THE HEYDAZE의 나눔코딩

나눔코딩

THE HEYDAZE

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © THE HEYDAZE. Designed by Fraccino.

티스토리툴바