🐥

Nuxt3でバリテーションの実装(日本語でエラー表示)

2024/04/07に公開

vee-validate, yupを使用して日本語でバリテーションエラーが表示される機能を実装します
今回はFieldというvee-validateのコンポーネントをデフォルトで使用する方法です
次回はFieldのコンポーネントそのままではなく、カスタマイズした実務寄りのやり方を記事にしたいと思います

完成イメージ

パッケージのドキュメント

https://www.npmjs.com/package/vee-validate
https://www.npmjs.com/package/yup
https://www.npmjs.com/package/yup-locale-ja
https://www.npmjs.com/package/@types/lodash

パッケージのインストール

npm install vee-validate --save
npm install yup yup-locale-ja
npm install --save @types/lodash

パッケージの説明

パッケージ名 説明
vee-validate バリテーションを簡単に実装できる
yup vee-validateで使用するバリテーションのルールを簡単に実装できる
yup-locale-ja yupのバリテーションメッセージを日本語化
@types/lodash カスタムバリテーションメッセージとyupのバリテーションメッセージを結合するのに使用

エラーメッセージの日本語化とカスタムバリテーションの追加

//plugins/vee-validate.client.ts
import _ from "lodash";
import { setLocale, type LocaleObject } from "yup";
import { suggestive } from "yup-locale-ja";

export default defineNuxtPlugin(() => {
  const customeLocaleObject: LocaleObject = {
    mixed: {
      required: ({ label }) => (label ? label + "は" : "") + "必須項目です", //①
    }
  }

  const LocaleObject = _.merge({}, suggestive, customeLocaleObject); //②

  setLocale(LocaleObject); //③
})

①で既存のバリテーションメッセージを変更しています
既存のバリテーションメッセージは「
{項目名}には値を入力してください」なのでそのままで良い方は設定不要です

②では日本語のバリテーションメッセージとカスタムバリテーションメッセージの設定を統合しています
①を作成していない方は②も作成不要です

③ではバリテーションメッセージの設定を適用しています
①、②を作成していない方はsetLocale(suggestive); に差し替えてください

バリテーションの実装

//app.vue
<template>
  <div>
    <Form :validationSchema="validationSchema" v-slot="{ meta: { valid } }"> //①
      <div>
        <p>メールアドレス</p>
        <Field name="email" v-model="email"/> //②
        <ErrorMessage name="email"/> //③
      </div>
      <div>
        <p>パスワード</p>
        <Field name="password" v-model="password" type="password"/>
        <ErrorMessage name="password"/>
      </div>
      <button :disabled="!valid">ログイン</button> //④
    </Form>
  </div>
  </template>
  
  <script setup lang="ts">
  import { ErrorMessage, Field, Form } from 'vee-validate';
  import * as yup from 'yup';

  const email = ref(""); //⑤
  const password = ref("");

  const validationSchema = yup.object().shape({
    email: yup.string().required().email().label("メールアドレス"), //⑥
    password: yup.string().required().min(8).label("パスワード")
  })
  </script>

①フォームのvalidationSchemaにバリテーションルールを設定します
v-slotにはバリテーションの有無でボタンを非活性化できるようにvalidを設定します

②Fieldが入力フォームにあたるのでname属性とv-modelで入力した内容を反映させるリアクティブの変数を指定します
ここのname属性は⑥で設定しているバリテーションルールのキーと同じになるようにしてください

③バリテーションエラーが発生した際にバリテーションルールを表示します
name属性は②と⑥同じになるようにしてください

④Formのv-slotで設定したvalidがバリテーションルールがある時にfalseになるので、バリテーションルールがある時はボタンを非活性化してフォームの内容を送信できないようにしています

⑤②で入力した内容を格納するリアクティブな変数を作成します

⑥Formに設定するバリテーションエラーのルールを作成します
labelで指定している項目名はvee-validate.client.tsで設定したカスタムエラーのlabelの変数にはいる値となるため、バリテーションエラーが表示される際は何の項目のエラーなのか分かりやすく表示することができます

よく使用するバリテーションのルールは下記のサイトを参考にしてください
https://massu-engineer.com/yup-validation-list/

Discussion