🧐
Vueにフォーム検証機能を実装する (vuelidate)
概要
- Vue.jsのフォーム検証機能を実装するため、
vuelidate
を実装したお話です。
はじめに
- 話さないこと
- Vue.jsの導入
- Vue 3.x での実例紹介
- カスタムバリデーションの方法
- 話すこと
- vuelidateの導入
- コンポーネントへの実装
- Vue 2.x での実例紹介
環境
- Vue.js 2.x
- Bootstrap 4.x
- npm ?
- 当時のバージョンのメモを失念してましたが、
13.x
だったと思います。 - 間違っていても最新バージョンで問題はないと思いますが、間違っていたらごめんなさい。
- 当時のバージョンのメモを失念してましたが、
導入
-
インストール
npm install vuelidate --save
-
インポート(グローバル設定)
import Vue from 'vue' import Vuelidate from 'vuelidate' Vue.use(Vuelidate)
コンポーネントに実装
-
$task.name
に対して 必須(required)検証をかけるimport { required } from 'vuelidate/lib/validators' export default { validations: { task: { name: { required, } } } }
-
templateに検証結果を反映する
<input type="text" :value="task.name" :class="{'is-invalid': $v.task.name.$invalid}" /> <div class="invalid-feedback" v-if="!$v.task.name.required">必須です</div>
-
実装イメージ
うまくいくとこんな感じになります。
どのように検証しているか?
-
validations
に対し、computedに$v
が生成され検証結果をリアクティブに反映してくれます。$v: { task: { name: { "required": false, "$invalid": true, "$dirty": false, "$error": false, } } }
-
$v
のプロパティについてName Description $invalid 検証結果がエラーだったらtrue $dirty 一度でも入力が行われたらtrue $error $invalid
と$dirty
が共にtrueだったらtrue -
入力が行われてから検証を開始したい時(初期表示でエラーにさせたくない)
-
$dirty
を使う必要がある。 - その準備として、
$touch
をInput
にバインドする、
バインドしないと$dirty
は反映されないので注意。 - また、
$invalid
ではなく$error
に変更します。
- :class="{'is-invalid': $v.task.name.$invalid}" + :class="{'is-invalid': $v.task.name.$error}" @input="$v.task.name.$touch()"
実装イメージ
-
実例紹介
-
4文字以上の検証を追加する
- import { required } from 'vuelidate/lib/validators' + import { required, minLength } from 'vuelidate/lib/validators' export default { validations: { task: { name: { required, + minLength: minLength(4) } } } }
実装イメージ
-
すべての検証がOKとなるまで登録ボタンをクリックできないようにする。
$v.invalid
には全ての検証結果が反映されているので、それを利用します。<button type="button" @click="onClickStore()" :disabled=$v.$invalid>Store</button>
実装イメージ
さいごに
- 個人的にフォームバリデーションはUX向上(ユーザーのストレス軽減)に大きく寄与すると感じていますしコスパも良いので、費用にもよりますが積極的に採用しています。
- (私の現場の業務用アプリではまだまだ2021年現在でも採用されない場合も多いですが、提案はします)
-
VeeValidate
も気になっているので、試したらまた記事しようと思います。
参考サイト
- vuelidate 公式様
- REFFECT様
- これでわかるvue.jsのフォームバリデーションVuelidate
- https://reffect.co.jp/vue/vue-js-validation-vuelidate
- LIG様
- SPAだけじゃない!Vue.js[4] プラグインでさらに便利に拡張する 〜vuelidateでフォーム検証〜
- https://liginc.co.jp/400430
Discussion