$npx -y skills add skilld-dev/vue-ecosystem-skills --skill vee-validate-skilldPainless forms for Vue.js. ALWAYS use when writing code importing \"vee-validate\". Consult for debugging, best practices, or modifying vee-validate, vee validate.
| 1 | # logaretm/vee-validate `vee-validate@4.15.1` |
| 2 | **Tags:** prev: 1.0.0-beta.10, next-edge: 4.5.0-alpha.2, edge: 4.5.0-alpha.6 |
| 3 | |
| 4 | **References:** [Docs](./references/docs/_INDEX.md) |
| 5 | ## API Changes |
| 6 | |
| 7 | This section documents version-specific API changes for vee-validate v4.x — prioritize these over legacy patterns. |
| 8 | |
| 9 | - BREAKING: `v-model` support disabled by default in v4.10.0 for performance; enable via `configure({ validateOnModelUpdate: true })` or per-field `syncVModel` [source](./references/releases/CHANGELOG.md) |
| 10 | |
| 11 | - NEW: `defineField` introduced in v4.9.0 — replaces `defineComponentBinds` and `defineInputBinds` for cleaner Composition API integration [source](./references/releases/CHANGELOG.md) |
| 12 | |
| 13 | - DEPRECATED: Reactive initial values deprecated in v4.12.0; use non-reactive objects or getters to prevent unintended sync [source](./references/releases/CHANGELOG.md) |
| 14 | |
| 15 | - NEW: `useFormContext` exposed in v4.14.0 for accessing form state in deeply nested components without manual injection [source](./references/releases/CHANGELOG.md) |
| 16 | |
| 17 | - NEW: `setValue` exposed on `Field` instances and slot props in v4.13.0 for manual value updates [source](./references/releases/CHANGELOG.md) |
| 18 | |
| 19 | - NEW: Composition setter hooks (`useSetFieldValue`, `useSetFormValues`, `useSetFormErrors`) added in v4.11.0 for external state management [source](./references/releases/CHANGELOG.md) |
| 20 | |
| 21 | - NEW: `handleBlur` accepts `shouldValidate` parameter since v4.10.0 to control validation triggers on blur events [source](./references/releases/CHANGELOG.md) |
| 22 | |
| 23 | - NEW: `syncVModel` accepts target model prop name as a string in v4.10.0 for custom model support [source](./references/releases/CHANGELOG.md) |
| 24 | |
| 25 | - NEW: `isValidating` state added to `useForm` and form slot props in v4.9.3 to track async validation status [source](./references/releases/CHANGELOG.md) |
| 26 | |
| 27 | - NEW: `move(oldIdx, newIdx)` added to `FieldArray` in v4.6.0 for reordering items within array fields [source](./references/releases/CHANGELOG.md) |
| 28 | |
| 29 | - NEW: Specialized state hooks (`useIsFieldDirty`, `useIsFormValid`, `useFieldValue`) added in v4.1.0 for granular state access [source](./references/releases/vee-validate@4.1.0.md) |
| 30 | |
| 31 | - DEPRECATED: `handleInput` deprecated in v4.4.0; use `handleChange` for both input and change events [source](./references/releases/CHANGELOG.md) |
| 32 | |
| 33 | - NEW: `label` support in `defineField` added in v4.12.0 for consistent error message generation [source](./references/releases/CHANGELOG.md) |
| 34 | |
| 35 | - NEW: `ResetFormOpts` with `force` flag added to `useResetForm` in v4.13.0 to clear values without merging [source](./references/releases/CHANGELOG.md) |
| 36 | |
| 37 | **Also changed:** `defineComponentBinds` deprecated · `defineInputBinds` deprecated · `useFieldModel` deprecated · `unsetValueOnUnmount` config added · `keepValuesOnUnmount` reactivity improved · `useForm` validate returns object · `useResetForm` hook added · `nested field meta querying` new v4.12.3 |
| 38 | |
| 39 | ## Best Practices |
| 40 | |
| 41 | - Prefer `defineField()` for binding components and inputs — returns a `v-model` ref and a props object for clean, non-deprecated binding [source](./references/docs/src/pages/api/use-form.mdx) |
| 42 | |
| 43 | ```ts |
| 44 | const [email, emailProps] = defineField('email', { |
| 45 | validateOnBlur: true, |
| 46 | props: state => ({ 'aria-invalid': !!state.errors.length }) |
| 47 | }); |
| 48 | ``` |
| 49 | |
| 50 | - Display errors conditionally using `meta.touched` — prevents "aggressive" validation where error messages appear before the user interacts with the field [source](./references/docs/src/pages/guide/best-practices.mdx) |
| 51 | |
| 52 | - Use `toTypedSchema()` for comprehensive TypeScript safety — wraps Yup, Zod, or Valibot schemas to differentiate between input (UI) and output (submitted) types [source](./references/docs/src/pages/guide/composition-api/typed-schema.mdx) |
| 53 | |
| 54 | ```ts |
| 55 | import { toTypedSchema } from '@vee-validate/zod'; |
| 56 | import * as z from 'zod'; |
| 57 | |
| 58 | const { values } = useForm({ |
| 59 | validationSchema: toTypedSchema(z.object({ email: z.string().email() })) |
| 60 | }); |
| 61 | ``` |
| 62 | |
| 63 | - Mark validation schemas as non-reactive — wrap schemas in `markRaw` or declare them outside of `ref`/`reactive` to avoid unnecessary deep reactivity overhead [source](./references/docs/src/pages/guide/best-practices.mdx) |
| 64 | |
| 65 | - Tree-shake schema validator imports — only import the specific functions you need (e.g., `import { string } from 'yup'`) to keep bundle sizes to a minimum [source](./references/docs/src/pages/guide/best-practices.mdx) |
| 66 | |
| 67 | - Pass reactive field names as getters in `useField` — use a function (e.g., `() => props.name`) to ensure vee-validate tracks name changes in dynamic forms [source](./references/docs/src/pages/guide/composition-api/caveats.mdx) |
| 68 | |
| 69 | - Enable `keepValuesOnUnmount` for multi-step forms — preserves field state when components |