antd vue表单验证_解决antd Form 表单校验方法无响应的问题

本文围绕Antd表单验证展开,介绍了validateFields等校验方法。指出自定义表单组件校验无响应是因validator方法问题。还讲述项目中多图片上传表单验证难题,通过自定义验证方法、设置validateTrigger为onSubmit、添加force属性为true等步骤解决了验证时机和重复验证问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

antd 的 表单校验方法包括 validateFields 和 validateFieldsAndScroll

里面可以接收校验字段数组, options, 和一个回调函数

from.validateFields([name, age], {}, (err, val)=> {})

校验全部表单数据

from.validateFields((err, val)=> {}) // 无响应

发现无响应, 无报错, 完全蒙逼了, 排查良久, 添加校验字段后发现可以成功校验, 于是想着大不了我全部手动添加字段名校验, 终于, 错误的原因浮现出来了

from.validateFields([name, age], (err, val)=> {}) // 正常

只要校验我自定义的一个表单组件, 这个方法就会无响应, 原因就是我自定义组件的自定义校验出现了问题

也就是 validator 方法里出现了问题 好好看看你的自定义校验吧

rules: [

{

validator: (rule, value, callback) => {

callback()

},

},

],

补充知识:解决Antd自定义表单验证问题

最近项目中遇到一个表单校验的问题,看官方文档、网上搜索找了好久,终于找到了解决方案。

先阐述一下问题:

项目中的表单需要多图片上传,这个使用Upload组件就OK了,但是表单验证就出现问题了:

1、首先,上传图片项是必须项,不能无图片提交;

2、已上传的图片可以删除;

3、后端要求提交的图片为md5格式,通过上传接口获取图片的md5值,这样就不能直接使用表单提交时获取的 value值,因 为它的值是本地路径,所以我通过model中上传图片获取md5的值存在model的state中 (这个问题是最棘手的)。

解决问题:

1、首先我自定义了一个表单验证方法,因为需要以上传成功的图片为基准。

自定义表单校验方法:

handleCheckImg = (rule, value, callback) => {

if (value) {

const { aware } = this.props;

const { fileList } = aware;

const newFileList=fileList.map(item => ({...item}));

if (!newFileList) {

callback('请上传相关图片');

} else {

newFileList.length ? callback() : callback('请上传相关图片');

}

}

callback(); // callback方法必须要有,否则会报错

};

在表单中调用:

{getFieldDecorator('attachment', {

rules: [

{ required: true, message: '请上传相关图片' },

{ validator: this.handleCheckImg },

],

})(

......

)}

此时表单的验证规则会调用到自定义的表单验证方法,但是由于验证方法默认是在表单onChange的时候调用,而默认onChange时进行表单验证,在model中用于存放图片md5值的变量还没有进行更新这里就已经进行验证了,这样的验证会导致,即便我已经上传了一张图片,页面上仍然会提示要我上传相关图片,删除图片却不会调用到表单验证。

那要怎么解决?那就让我点击按钮准备submit时进行表单验证吧。

2、通过看文档,表单的getFieldDecorator方法中有个属性validateTrigger可以设置什么时候进行表单验证,默认是onChange。

于是我在方法中添加该属性,设置为onSubmit:

getFieldDecorator('attachment', {

rules: [

{ required: true, message: '请上传相关图片' },

{ validator: this.handleCheckImg },

],

validateTrigger: 'onSubmit', // 设置进行表单验证的时机为onSubmit

initialValue: detail ? detail.imgList : null,

})

这样设置了以后虽然可以正常进行表单验证了,但是,当点击了一次提交按钮后,表单验证过的表单项不会再进行验证。那万一我点击一次提交后,表单中其他表单项有问题,而图片上传没有问题,那我将其他表单项都填好符合验证格式后,删除了图片,再点击提交按钮,表单不会再验证图片上传的表单项,这样就被通过了,不行呀,这是一个bug。

怎么解决呢?那就点击提交的时候,都对所有表单项进行一次验证,无论是否已经验证过的。

3、Antd框架的validateFields方法中有一个force属性可以设置是否对已校验过的表单项再次校验,默认是false。

于是我在该方法中添加这个属性,设置为true。

handleSubmit = (e) => {

e.preventDefault();

this.props.form.validateFields({ force: true }, (err, values) => { // 设置force为true

......

});

};

这样就解决了我的问题。

以上这篇解决antd Form 表单校验方法无响应的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

### Vue2 中使用 Ant Design Vue 实现表单验证Vue2 和 Ant Design Vue 的组合中,可以通过 `a-form` 或者 `a-form-model` 组件来实现表单验证功能。以下是两种常见的实现方式: #### 方法一:基于 `a-form` 的自定义校验方法适合需要复杂逻辑或者动态调整校验规则的情况。 ```html <template> <a-form ref="formRef" :model="dataForm" :rules="rules"> <!-- 群聊选择 --> <a-form-item ref="groupChat" label="选择群聊" name="chatId" :rules="[{ required: true, trigger: 'change', validator: validatorChatGroup }]"> <SelectChatGroup :corp-id="$route.query?.corpId ?? null" v-model="dataForm.chatId.chatIds" /> <SelectedChatGroupList v-if="dataForm.chatId.chatIds.length" v-model="dataForm.chatId.chatIds" /> </a-form-item> <!-- 提交按钮 --> <a-button type="primary" @click="handleSubmit">提交</a-button> </a-form> </template> <script> export default { data() { return { dataForm: { chatId: { chatIds: [] } }, rules: {} }; }, methods: { // 自定义校验函数 validatorChatGroup(rule, value, callback) { if (value && value.length > 0) { callback(); } else { callback(new Error('请选择至少一个群聊')); } }, handleSubmit() { this.$refs.formRef.validate(valid => { if (valid) { console.log('表单数据:', this.dataForm); } else { console.error('表单验证失败'); } }); } }, watch: { 'dataForm.chatId.chatIds': { handler() { this.$refs.groupChat.clearValidate(); // 清除当前字段的错误提示 } } } }; </script> ``` 在此示例中,通过 `validator` 属性指定了自定义校验逻辑[^1]。当用户更改 `chatId.chatIds` 值时,会触发 `watch` 函数中的 `clearValidate()` 来移除之前的警告消息。 --- #### 方法二:基于 `a-form-model` 的内置校验 如果只需要简单的必填项或其他基础校验,则可以采用更简洁的方式——利用 `a-form-model` 的默认行为完成校验。 ```html <template> <a-form-model ref="ruleForm" :model="formData" :rules="rules"> <!-- 用户名输入框 --> <a-form-model-item label="用户名" prop="username"> <a-input v-model="formData.username" placeholder="请输入用户名"></a-input> </a-form-model-item> <!-- 密码输入框 --> <a-form-model-item label="密码" prop="password"> <a-input v-model="formData.password" placeholder="请输入密码"></a-input> </a-form-model-item> <!-- 提交按钮 --> <a-button type="primary" @click="submitForm">提交</a-button> </a-form-model> </template> <script> export default { data() { const validateUsername = (rule, value, callback) => { if (!value || value.trim().length === 0) { callback(new Error('用户名不能为空')); } else { callback(); } }; const validatePassword = (rule, value, callback) => { if (!value || value.length < 6) { callback(new Error('密码长度不得小于6位')); } else { callback(); } }; return { formData: { username: '', password: '' }, rules: { username: [{ validator: validateUsername, trigger: ['blur'] }], password: [{ validator: validatePassword, trigger: ['blur'] }] } }; }, methods: { submitForm() { this.$refs.ruleForm.validate(valid => { if (valid) { alert('提交成功!'); } else { console.error('表单验证失败'); } }); } } }; </script> ``` 在这个例子中,我们为每个字段绑定了对应的校验规则,并通过 `validate` 方法手动触发表单验证[^2]。 --- ### 总结 以上展示了如何在 Vue2 中结合 Ant Design Vue 使用不同的形式进行表单验证。对于简单场景推荐使用 `a-form-model`;而对于复杂的业务需求则更适合选用 `a-form` 并配合自定义校验器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值