目次
はじめに
Vue.jsのバリデーションで最大手のVeeValidateですが、ドキュメントの癖が強すぎて理解するのに苦労します。
特にカスタムルールの設定方法が理解しづらすぎて、ゲロ吐きそうになります。
今回は、ドキュメントを見直すことが無いように、設定方法を記事に残しておこうと思います。
環境
この記事は、以下の管理人の検証環境にて記事にしています。
| vue.js | 2.6.10 |
| vee-validate.js | 3.2.3 |
| rules.umd.min.js | 3.2.3 |
導入手順
基本となるサンプルとして、入力フォームに「kabanoki」と入力しないとエラーになるバリデーションルールを実装します。
まずは下記のコードを参照します。
コード
//呼び出し
const VeeValidate = window.VeeValidate;
const VeeValidateRules = window.VeeValidateRules
const ValidationProvider = VeeValidate.ValidationProvider;
const ValidationObserver = VeeValidate.ValidationObserver;
//コンポーネントの取り込み
Vue.component('ValidationProvider', ValidationProvider);
Vue.component('ValidationObserver', ValidationObserver);
//required ルール設定
VeeValidate.extend('required', VeeValidateRules['required']);
//カスタムルール設定
const myRule = {
params: ['str'],
message: '{_field_}が{str}と一致しません。',
validate(value, {str}) {
return value == str;
}
};
VeeValidate.extend('my_rule', myRule);
let app = new Vue({
el: '#app',
data: {
value: '',
},
methods: {
submit: function(){
alert('送信しました!');
}
}
});
<div id="app">
<validation-observer ref="obs" v-slot="{invalid, validated, valid}">
<div class="filed">
<validation-provider name="my_rule" rules="required|my_rule:kabanoki">
<div slot-scope="{ errors }">
<input type="text" name="my_rule" v-model="value" value="">
<p class="error">{{ errors[0] }}</p>
</div>
</validation-provider>
</div>
<button type="button" @click="submit" :disabled="!valid">送信</button>
</validation-observer>
</div>
実装サンプル
コードの解説
今回は myRule というオブジェクトを作成し、my_ruleというカスタムルールを設定しています。
const myRule = {
params: ['str'],
message: '{_field_}が{str}と一致しません。',
validate(value, {str}) {
return value == str;
}
};
VeeValidate.extend('my_rule', myRule);
ざっと流れに沿って解説します。
ルール式の設定
ルール式 は validate プロパティで設定します。
第一引数にフォームの value値が返ります。
第二引数に params プロパティで設定したパラメーターが返ります。
エラーメッセージの設定
エラーメッセージは、 message プロパティに設定します。
params プロパティにパラメーター設定することで message プロパティで {str} のようなテンプレート文字列が使用できます。
カスタムルールを設定
作成したmyRuleオブジェクトを extend に取り込みます。
あとは普段通りに
<validation-provider name="my_rule" rules="my_rule:kabanoki">
として設定してやります。
メッセージのテンプレート
| _field_ | フィールド名 |
| _value_ | 検証されたフィールド値 |
| _rule_ | このメッセージをトリガーしたルール名 |
さいごに
ドキュメントと他ブログを比較したりして、バージョンの違いに気が付き、ここまで調べるのに2日かかるという・・・
今日はもう一本、他のフィールドと比較するクロスフィールド検証の記事もあげます。
https://www.kabanoki.net/5136/