VeeValidate 如何在表单提交时手动触发验证?

Tr° 启腾 阅读 199

我用 VeeValidate 做表单校验,但点击提交按钮时没自动验证,想手动触发却不知道咋搞。

试过调用 validate(),但控制台报错说不是函数。我的 setup 里是这么写的:

import { useField, useForm } from 'vee-validate';

export default {
  setup() {
    const { handleSubmit, validate } = useForm();
    const { value: email } = useField('email', 'required|email');

    const onSubmit = handleSubmit((values) => {
      console.log(values);
    });

    return { email, onSubmit, validate };
  }
}

是不是不能直接把 validate 暴露出去?该怎么正确调用呢?

我来解答 赞 10 收藏
二维码
手机扫码查看
2 条解答
轩辕丽苹
问题很简单,useForm 返回的 validate 根本不是给你直接用的,那是内部方法。

VeeValidate 4.x 里正确的做法是用 validateForm 函数来手动验证整个表单:

import { useField, useForm, validateForm } from 'vee-validate';

export default {
setup() {
const { handleSubmit } = useForm({
validationSchema: {
email: 'required|email'
}
});
const { value: email } = useField('email');

const onSubmit = handleSubmit((values) => {
console.log(values);
});

// 手动触发验证
const handleClick = async () => {
const result = await validateForm();
if (result.valid) {
onSubmit();
} else {
console.log('验证失败', result.errors);
}
};

return { email, handleClick };
}
};


如果你只想验证单个字段,从 useField 解构出来的那个字段对象本身就带 validate 方法:

const { value: email, validate: validateEmail } = useField('email', 'required|email');

const checkEmail = async () => {
await validateEmail();
};


另外提醒一下,handleSubmit 默认会在提交时自动验证的,前提是你得在 useForm 或 useField 里配好校验规则。你那段代码里 useField 写了规则,但 useForm 没配 validationSchema,验证可能压根没生效。
点赞
2026-03-19 07:11
夏侯文仙
你这情况很常见,validate确实是暴露出去就能用的,但你可能漏了个小细节。在JS里面,setup返回的validate是个函数引用,但模板里直接调用可能会出问题。

正确做法是,在setup里先把validate函数解构出来,然后在提交前手动调用它。比如这样:

const { handleSubmit, validate } = useForm();

const onSubmit = async () => {
const { valid } = await validate(); // 关键在这里
if (!valid) return;

handleSubmit((values) => {
console.log(values);
})();
};


或者更简单的写法,直接在模板的点击事件里套两层:
@click="onSubmit"
// 改成
@click="() => validate().then(onSubmit)"


报错说不是函数的话,检查下是不是把validate拼错了,或者解构时变量名冲突了。VeeValidate的validate()返回的是个Promise,记得用async/await或者.then处理。

另外吐槽下,VeeValidate这文档写得确实有点迷,我当初也被坑过好几次。
点赞 1
2026-03-08 02:02