LoginSignup
5
11

More than 3 years have passed since last update.

Vue.js バリデーション

Posted at

ライブラリ

VeeValidate が機能豊富でメンテナンスも継続的に行われている。vuelidate もよく紹介されているが、こちらは最新リリースが2018年5月リリースのv0.7.4となっている。(2019年11月時点)

参考

VeeValidateの使い方(BootstrapVueとの組み合わせ)

基本的な使い方は UI libraries BoostrapVue がとても参考になる。

対象バージョン
  • Vue.js 2.6.10
  • VeeValidate 3.0.11
  • BootstrapVue 2.0.4

※ VeeValidateは3系で大きく使い方が変わっているが、VeeValidateについて検索すると古いバージョンに関する記事が多くヒットするため、参考にする際は説明されているVeeValidateのバージョンに注意すること。

インストール
npm install -S vee-validate
コンポーネント読み込み

グローバルに全ルール・メッセージバンドル版を読み込む場合は、main.tsで以下のように記述する。

import Vue from 'vue';
// @ts-ignore
import { ValidationProvider } from 'vee-validate/dist/vee-validate.full';
import { ValidationObserver } from 'vee-validate';

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

プロダクション用には、バンドルサイズを抑えるために必要なルール・メッセージのみインポートする方がよい。(参考:Importing validation rules

提供されているルール一覧は Validation Rules を参照。

バリデーション実装

フォームコンポーネントの実装例(Form.ts):

<template>
  <ValidationObserver ref="observer" v-slot="{ passes }">
    <b-form novalidate @submit.prevent="passes(onSubmit)">
      <ValidationProvider name="title" rules="required|max:10"
                          v-slot="{ errors, valid, validated }">
        <b-form-group label-cols-sm="3" label="Title" label-for="title">
          <b-form-input v-model="title" type="text"
            :state="validated ? valid : null"></b-form-input>
          <b-form-invalid-feedback>{{ errors[0] }}</b-form-invalid-feedback>
        </b-form-group>
      </ValidationProvider>
      <b-form-group>
        <b-row class="justify-content-center">
          <b-button class="col-sm-4" type="submit" variant="primary">Submit</b-button>
        </b-row>
      </b-form-group>
    </b-form>
  </ValidationObserver>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';

@Component()
export default class Form extends Vue {
  private title: string = '';
  private onSubmit(): void {
    ...
  }
}
</script>

Validation Provider コンポーネントでは、rules属性に適用するバリデーションルール(上記の場合は必須かつ10文字以内というルール)を列挙し、name属性にエラーメッセージに使われるフィールド名を指定する。(参考:Customizing the filed nameb-form-input のstate属性を validated ? valid : null と指定することで、「初期表示状態ではエラーメッセージを表示せずに、初回入力後にバリデーション違反があれば表示する」という制御をしている。

ValidationObserver コンポーネントを使うことで、フォーム全体のバリデーション状態に基づいて制御が記述できる。上記では @submit.prevent="passes(onSubmit)" により、フォーム送信時にバリデーションを実行して、バリデーションを通過した場合のみ onSumit を実行するようにしている。

5
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
11