You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vuetify + Vee-Validate 多步骤表单:避免挂载时自动校验

解决Vee-Validate+Zod动态字段自动触发校验的问题

动态创建表单字段(重复器或多步骤挂载)时,Vee-Validate默认会在字段挂载完成后立即执行校验,而Zod的必填类规则会直接将初始空值判定为错误,导致用户未操作就出现错误提示。以下是几种实用的解决办法:

1. 启用lazy延迟校验

给动态字段的<Field>组件添加lazy属性,让校验只在用户触发交互(输入、失焦等)后才执行:

<Field
  v-model="item.value"
  :name="`dynamic_${item.id}`"
  :rules="dynamicFieldRule"
  lazy
/>

如果用useField组合式API,在配置中开启lazy:

const { value, error } = useField(`dynamic_${id}`, dynamicFieldRule, { lazy: true });

2. 调整Zod规则兼容初始空值

通过optional()配合refine(),让字段初始空值不触发校验,仅当用户输入后清空时才报错:

import { z } from 'zod';

const dynamicFieldRule = z
  .string()
  .optional()
  .refine(val => val?.trim() !== '', '此字段不能为空');

这样刚创建的空字段不会触发错误,用户输入后再删除内容才会提示校验失败。

3. 全局关闭挂载时自动校验(多场景适配)

在useForm中关闭validateOnMount,仅在切换步骤或提交时手动触发校验,同时给不同步骤的字段设置scope分组,精准控制校验范围:

const { handleSubmit, validate } = useForm({
  validateOnMount: false,
});

// 切换下一步前校验当前步骤字段
const nextStep = async () => {
  const { valid } = await validate({ scope: 'step-1' });
  if (valid) {
    currentStep.value = 2;
  }
};

字段上绑定scope:

<Field
  v-model="formData.name"
  name="name"
  :rules="nameRule"
  scope="step-1"
/>

4. 给动态字段设置合法默认值

如果业务场景允许,给新增的动态字段设置符合Zod规则的默认值,避免初始空值触发校验:

const addField = () => {
  dynamicFields.push({
    id: Date.now(),
    value: '', // 若规则允许空字符串则直接用,否则设为合法初始值
  });
};

内容的提问来源于stack exchange,提问作者RonZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:35:11