vee-validate-skilld について
vee-validate-skilldは、vee-validate 4.15.1でフォームを検証するVue 3開発者向けのリファレンスです。Composition APIや宣言的コンポーネント、フィールドパス、検証モード、実装時の注意点を解説します。
主な機能
- 01Composition APIによるフォーム管理
- 02FormとFieldの宣言的コンポーネント
- 03フィールドと配列フィールドの管理
- 04Yup、Zod、Valibotのスキーマアダプター
- 05検証タイミングとエラー処理
活用シーン
- 01Vue 3アプリでフォーム検証を実装
- 02ネストしたオブジェクトや配列フィールドを処理
- 03TypeScriptフォームに型付きスキーマを設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ skilld-dev/ vue-ecosystem-skills --skill vee-validate-skilldインストール後、Claude Code で/vee-validate-skilldを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/api-surface.mdcomponents.mdcomposition-api.mdpitfalls.mdvalidation.mdversion-changes.md詳細
vee-validate 4.15.1
Vue 3 向けのフォームバリデーションです。以下の情報は、準備されたソース(dist/vee-validate.d.ts、dist/vee-validate.mjs、package.json)および公式ドキュメント(https://vee-validate.logaretm.com/v4/)に基づいています。
環境
- パッケージは
[email protected]です(package.json:3)。ピア依存関係としてvue ^3.4.26が必要です(package.json:42)。 - ESM と CJS に対応し、
sideEffects: falseで、エントリーポイントはvee-validateのみです(package.json:11-26)。 - v4 は Vue 3 のみをサポートします。Vue 2 には vee-validate 2.x/3.x が必要です(README:69-72)。
- スキーマアダプターは別パッケージとして提供されています:
@vee-validate/yup、@vee-validate/zod、@vee-validate/valibot。グローバルルールは@vee-validate/rules、メッセージは@vee-validate/i18nにあります。
2 種類の API スタイル
Composition API(新しいコードで推奨)。 useForm + defineField + handleSubmit:
<script setup>
import { useForm } from 'vee-validate';
function required(value) {
return value ? true : 'This field is required';
}
const { defineField, handleSubmit, errors } = useForm({
validationSchema: { field: required },
});
const [field, fieldProps] = defineField('field');
const onSubmit = handleSubmit(values => {
console.log(values);
});
</script>
<template>
<form @submit="onSubmit">
<input v-model="field" v-bind="fieldProps" />
<span>{{ errors.field }}</span>
<button>Submit</button>
</form>
</template>
出典:README:84-118、https://vee-validate.logaretm.com/v4/guide/composition-api/getting-started/
宣言的コンポーネント。 スコープ付きスロットを使った Form + Field:
<script setup>
import { Field, Form } from 'vee-validate';
function required(value) {
return value ? true : 'This field is required';
}
function onSubmit(values) {
console.log(values);
}
</script>
<template>
<Form v-slot="{ errors }" @submit="onSubmit">
<Field name="field" :rules="required" />
<span>{{ errors.field }}</span>
<button>Submit</button>
</Form>
</template>
出典:README:122-153、https://vee-validate.logaretm.com/v4/guide/components/handling-forms/
基本ルール
defineField(path, config?)でフィールドをバインドします。[model, props]が返されます。v-bindで props を展開し、v-modelで model をバインドします(dist/vee-validate.d.ts:443、https://vee-validate.logaretm.com/v4/api/use-form/#definefield)。values.fieldに直接書き込まないでください。defineFieldの model、setFieldValue、またはuseSetFieldValueを使用してください。useFieldModel、defineComponentBinds、defineInputBindsは非推奨であり、defineFieldの使用が推奨されています(dist/vee-validate.d.ts:444-459)。- 過度に積極的なバリデーションによる UX を避けるため、たとえば
v-if="errorMessage && meta.touched"のように、操作後にのみエラーを表示してください(https://vee-validate.logaretm.com/v4/guide/best-practices/#avoiding-aggressive-validation)。 - TypeScript では、yup/zod/valibot のスキーマを、対応する
@vee-validate/*パッケージのtoTypedSchemaでラップしてください。ラップせずにスキーマをそのまま渡すと、"No such validator 'VVTypedSchema' exists" というエラーになります(https://vee-validate.logaretm.com/v4/guide/composition-api/typed-schema/、https://github.com/logaretm/vee-validate/discussions/4819)。 - カスタムコンポーネント内の
useFieldは、デフォルトでは v-model を同期しないようにしてください(syncVModelのデフォルトはfalseです。4.10.0 での破壊的変更)。フィールドごとにsyncVModel: trueまたはモデルの prop 名を表す文字列を指定すると有効になります(dist/vee-validate.mjs:1862)。 - フィールド名はパスとして扱われます。ドットはオブジェクトのネストを表し、
[0]は配列のインデックスを表します。ドットを文字として扱うには、たとえば[user.name]のように名前を角括弧で囲んでください(https://vee-validate.logaretm.com/v4/guide/composition-api/nested-objects-and-arrays/)。 errorsオブジェクトは常にフラットです。角括弧も含め、フィールド名として使った正確なパス文字列を参照してください(https://vee-validate.logaretm.com/v4/guide/composition-api/nested-objects-and-arrays/)。- 配列フィールドを反復処理するには、
useFieldArrayのfieldsを使い、v-forのキーにはentry.key(安定した ID。インデックスは使用しないでください)を指定してください(https://vee-validate.logaretm.com/v4/guide/composition-api/nested-objects-and-arrays/)。 - リアクティブなフィールド名は getter として渡し(
useField(() => props.name))、vee-validate が名前の変更を追跡できるようにしてください(https://vee-validate.logaretm.com/v4/guide/composition-api/caveats/)。 - スキーマはリアクティブにしないでください。深いリアクティブ化によるオーバーヘッドを避けるため、
ref/reactiveの外で宣言するか、markRawでラップしてください(https://vee-validate.logaretm.com/v4/guide/best-practices/#reactive-schemas)。 handleSubmit.withControlled(cb)は、useField/defineFieldで登録されたフィールドのみを送信します(dist/vee-validate.d.ts:430-432)。ただし、型付きスキーマでは初期値がすべて表面化する場合があることに注意してください(未解決の issue:https://github.com/logaretm/vee-validate/issues/4960)。
検証モード
グローバルのデフォルト値は、validateOnBlur: true、validateOnChange: true、validateOnInput: false、validateOnModelUpdate: true、bails: trueです。configure()でグローバルに変更できます。なお、これら4つのトリガーフラグは<Field>コンポーネントにのみ適用され、useFieldには適用されません(https://vee-validate.logaretm.com/v4/api/configuration/)。送信時のみ検証するには、`defineField`の設定でフィールドごとに入力/変更/フォーカスアウトのトリガーを無効にするか、グローバルに無効にします(https://github.com/logaretm/vee-validate/discussions/4903)。
参考資料
- Composition API:
useForm、defineField、useField、useFieldArray、状態およびセッターのコンポーザブル、フォームコンテキスト。 - コンポーネント:
Form、Field、FieldArray、ErrorMessageのprops、スロット、レンダリング、v-modelのルール。 - 検証:バリデーター関数、オブジェクトスキーマ、型付きスキーマ、グローバルルール、i18n、単独で使用する
validateユーティリティ。 - APIの概要:すべてのランタイムエクスポートと主な型。
dist/vee-validate.d.tsを参照。 - バージョンごとの変更点:4.9.0から4.15.1までのAPI追加、破壊的変更、非推奨化。
- 注意点:コンポジションに関する注意事項、ネストされたパスのルール、配列フィールド、既知の未解決課題。