今回は、Vuelidateを使ったフォームバリデーションについて、
エラー内容を任意のメッセージに変更する方法を記します。
Vuelidateは、英語や日本語のエラー文字列を備えているものの、
汎用的な内容のため、変更したいと思うことがあるかもしれません。
以下の方法で簡単に変更が可能です。
バリデーションエラーを任意の文字列に変更する。
デフォルトのエラーメッセージ
<v-text-field v-model="state.id" variant="solo" label="input" :counter="15" required @input="v$.id.$touch" @blur="v$.id.$touch" v$.id.$errors.map(e => e.$message) ></v-text-field> ... <script setup> import { useVuelidate } from '@vuelidate/core' import { required, maxLength, minLength } from '@vuelidate/validators' export default { setup(props,context) { const initialState = { id: '', } const state = reactive({ ...initialState, }) const rules = { id: { required, minLength:minLength(4), maxLength:maxLength(15), } } const v$ = useVuelidate(rules, state) return { state, v$ } } </script>
これにより、上記のテキストフィールドは、
- required (必須)
- minLength:minLength(4) (4文字以上)
- maxLength:maxLength(15) (15文字未満)
ではないと、エラーが表示されます。
ただし、requiredのようにエラーが表示されるため
その文字列を変更します。
任意のエラーメッセージに変更する
<v-text-field v-model="state.id" variant="solo" label="input" :counter="15" required @input="v$.id.$touch" @blur="v$.id.$touch" errorMessageConnect(v$.id.$errors) ></v-text-field> ... <script setup> import { useVuelidate } from '@vuelidate/core' import { required, maxLength, minLength } from '@vuelidate/validators' export default { setup(props,context) { const initialState = { id: '', } const state = reactive({ ...initialState, }) const rules = { id: { required, minLength:minLength(4), maxLength:maxLength(15), } } const errorMessage = { id:{ required:'入力必須です。', minLength:'4文字以上で入力してください。', maxLength:'15文字以内で入力してください。', } } const errorMessageConnect = (obj) =>{ if(obj == []) return []; const el = obj.map(e => e.$property)[0]; const validator = obj.map(e => e.$validator)[0]; return errorMessage?.[el]?.[validator] } const v$ = useVuelidate(rules, state) return { state, errorMessageConnect, v$ } } </script>
以上のように書きました。
具体的に、
errorMessageに添字でrulesで指定した添字を入れます。
そして、それぞれキーに、rulesと同じキーを指定します。
値にエラー時に表示されたい文字列を指定します。
const errorMessage = { id:{ required:'入力必須です。', minLength:'4文字以上で入力してください。', maxLength:'15文字以内で入力してください。' } }
他の項目についても同様に
エラー表示を指定するのであれば、id:{}に続く形で
id:{},name:{}のように記せば、任意の文字列で表示できます。
おわりに
v$をtemplate内で出力してあげると、オブジェクトがリアクティブで
どのような値がどんなふうに変化しているか把握できます。
Vuelidateは、非同期処理にも対応しているので
dbにリクエストしてIDの不一致等調べることができます。
やはり、フロントエンドとバックエンドそれぞれでバリデーションは必要ですので
出力だけでもかなり煩雑なります。共通して利用できるので非常に便利です。
コメント