关于 vee-validate-skilld
vee-validate-skilld 为 Vue 3 开发者提供 vee-validate 4.15.1 表单验证的 API 与实践参考。内容涵盖组合式 API、声明式组件、字段路径、验证模式及常见注意事项。
主要功能
- 01组合式 API 表单管理
- 02Form 与 Field 声明式组件
- 03字段与数组字段管理
- 04支持 Yup、Zod、Valibot schema 适配器
- 05验证触发配置与错误处理
适用场景
- 01在 Vue 3 应用中构建表单验证
- 02处理嵌套对象和数组字段
- 03为 TypeScript 表单配置类型化 schema
安装
复制下面的命令,在终端中运行。
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)。需要 peer 依赖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)。
- Schema 适配器位于独立包中:
@vee-validate/yup、@vee-validate/zod、@vee-validate/valibot;全局规则在@vee-validate/rules中;消息在@vee-validate/i18n中。
两种 API 风格
组合式 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)。- 仅在用户交互后显示错误,例如使用
v-if="errorMessage && meta.touched",以避免验证体验过于激进(https://vee-validate.logaretm.com/v4/guide/best-practices/#avoiding-aggressive-validation)。 - 使用 TypeScript 时,请使用对应的
@vee-validate/*包中的toTypedSchema包装 yup/zod/valibot schema。直接传入原始 schema 而不进行包装会报错:"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的 key 设为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/)。 - 保持 schema 非响应式:在
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);请注意,类型化 schema 仍可能包含所有初始值(未解决的问题:https://github.com/logaretm/vee-validate/issues/4960)。
验证模式
全局默认值:validateOnBlur: true、validateOnChange: true、validateOnInput: false、validateOnModelUpdate: true、bails: true。使用 configure() 进行全局更改;请注意,这四个触发标志仅适用于 <Field> 组件,不适用于 useField(https://vee-validate.logaretm.com/v4/api/configuration/)。若要仅在提交时验证,请在 defineField 配置中或全局禁用输入、变更和失焦触发(https://github.com/logaretm/vee-validate/discussions/4903)。
参考资料
- 组合式 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 新增、破坏性变更和弃用内容。
- 注意事项:组合式 API 的注意事项、嵌套路径规则、数组字段、已知未解决问题。