vant框架form表单提交失败

今天在做表单提交的时候,发现了一个很奇怪的bug,由于表单中有van-uploader上传图片的组件,在上传图片时能正常提交,但是在未上传图片时却死活提交不了,并且控制台报了一个警告

百度后说是表单校验规则未通过?!

上传图片并不是必选项啊,也没有设置校验条件。

最后排查了一圈,发现了问题所在

就是这个filesData参数,在上传了图片后,这个filesData.value[0]是有值的,但是在没有传的时候是undefined,正是因为这个undefined在这个提交方法内,导致表单提交没有成功,但是这个警告就很离谱了,但凡报个错也不至于浪费我这么长时间排查原因。

总结:如果在使用vant框架出现van-form表单出现上面的警告无法提交,在排查不是校验规则未通过的情况下,最好检查一下提交方法内是不是存在类似undefined的报错,因为不会在控制台上打印出来,所以很具有迷惑性。

### Vant 表单验证的实现与使用 在 Vant 框架中,`van-form` 组件提供了强大的功能来处理表单数据以及执行字段级别的校验。通过 `van-field` 子组件,开发者能够轻松定义必填项、格式校验规则以及其他交互行为。 #### 基本概念 `van-form` 是一个容器组件,用于包裹多个 `van-field` 或其他自定义输入控件。它支持提交事件监听和全局校验逻辑[^2]。以下是其实现方式的具体说明: #### 实现方法 1. **绑定模型** 使用 `v-model` 将每个 `van-field` 的值绑定到 Vue 数据对象中的变量上。这使得可以通过编程访问这些值并对其进行操作。 2. **设置校验规则** 利用 `rules` 属性为每一个字段指定其对应的校验条件。例如,手机号码需要满足特定正则表达式;邮箱地址也应遵循标准格式。 3. **触发校验** 提交按钮点击时调用 `validate()` 方法手动触发表单项的校验过程。如果所有项目都符合条件,则返回成功状态;否则会显示错误提示信息给用户查看。 4. **动态更新界面反馈** 当某个字段未通过检验时,自动在其旁边显示出错消息。此特性增强了用户体验,帮助他们快速定位问题所在之处。 下面是一个完整的代码示例展示了如何配置上述提到的功能点: ```html <template> <van-form @submit="onSubmit"> <!-- 手机号码 --> <van-field v-model="phone" name="phone" label="手机号" placeholder="请输入手机号" :rules="[{ required: true, message: '请填写手机号' }, { pattern: /^1[3-9]\d{9}$/, message: '手机号格式不正确'}]" /> <!-- 邮箱 --> <van-field v-model="email" name="email" type="email" label="邮箱" placeholder="请输入邮箱" :rules="[{ required: true, message: '请填写邮箱'}, {pattern:/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,message:'邮箱格式有误'}]" /> <!-- 图片上传 --> <van-field name="uploader" label="图片上传"> <template #input> <van-uploader v-model="fileList" :after-read="afterRead" max-count="1" accept=".jpg,.png" :before-upload="(file) => checkFileSize(file)" /> </template> </van-field> <div style="margin: 16px;"> <van-button round block type="info" native-type="submit">提交</van-button> </div> </van-form> </template> <script> export default { data() { return { phone: '', email: '', fileList: [] }; }, methods:{ onSubmit(values){ console.log('form values:',values); }, afterRead(file){ this.fileList.push(file); // 添加文件至列表 }, checkFileSize(file){ const maxSize = 5 * 1024 * 1024; // 最大允许尺寸为5MB if (file.size > maxSize){ alert(`文件过大,请选择小于${maxSize / (1024*1024)} MB 的文件`); return false; } return true; } } }; </script> ``` 以上代码片段实现了基本的表单结构,并包含了必要的校验机制。 #### 注意事项 为了确保最佳实践,在实际开发过程中还需要注意以下几点: - 对于复杂的业务场景可能需要用到更高级别的校验库比如 async-validator 来增强灵活性; - 如果涉及到异步请求或者依赖外部服务完成某些特殊类型的验证(如验证码有效性),可以结合 Promise 和 custom validator 函数一起工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总想害朕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值