关于uni-app中uni-forms表单验证时“多级结构对象数据”如何做数据校验的解决方案

本文介绍了在uni-app中遇到的uni-forms表单验证问题,特别是对于多级结构对象数据的处理。当formsData包含多级对象时,常规的验证方法无法生效。解决方案是采用uni-app的动态表单校验,通过数组方式表示name,将多级key组合在数组中,以此实现数据校验。这种方法避免了在uni-forms的rules中为每一级key定义规则。

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

- 前言

这几天在做uni-app表单验证时遇到了一个问题,按官方文档给出的方法,当需要数据校验时,只需要
1.为uni-forms中的"modelValue"数据设置“:rules”对应
2.“uni-forms-item”的name和“uni-easyinput”中“v-model”中的key和“rules”中的key相同
就可以对该项“uni-easyinput”做数据校验了。
在这里插入图片描述
在这里插入图片描述

这一步很多人看官方文档就能够写好,并没有其他问题。

- 问题

问题在于,formsData不可能只是一层对象,这里面很可能是对象包对象,也就是“多级结构对象数据”(如图所示),此时,按上面的校验方法,当“uni-easyinput”后面有很多级时,name就不知道如何写了,rules也没有可以参照的方法。
在这里插入图片描述

如果你再按下图这样写,那name是找不到rules中与

### uni-forms 组件的使用方法 `uni-forms` 是 `uni-app` 提供的一个增强型表单组件,支持双向绑定和复杂的校验功能。以下是关于其基本使用方法以及一些常见场景下的注意事项。 #### 基本使用 通过 `uni-forms` 的属性配置可以轻松实现表单的数据绑定与验证。核心属性包括: - **model**: 表单数据对象,用于存储表单字段值。 - **rules**: 验证规则,定义每个字段的校验逻辑[^2]。 下面是一个简单的例子展示如何初始化并使用 `uni-forms` 进行表单验证: ```vue <template> <view> <uni-forms :model="formData" :rules="formRules"> <!-- 输入框 --> <uni-forms-item name="username"> <uni-easyinput v-model="formData.username" placeholder="请输入用户名"></uni-easyinput> </uni-forms-item> <!-- 密码输入框 --> <uni-forms-item name="password"> <uni-easyinput type="password" v-model="formData.password" placeholder="请输入密码"></uni-easyinput> </uni-forms-item> <!-- 提交按钮 --> <button @click="submitForm">提交</button> </uni-forms> </view> </template> <script> export default { data() { return { formData: { username: '', password: '' }, formRules: { username: { required: true, message: '用户名不能为空', trigger: ['blur'] }, password: { required: true, minLength: 6, message: '密码长度至少为6位', trigger: ['change'] } } }; }, methods: { submitForm() { this.$refs.uniForms.validate().then(res => { console.log('表单验证成功:', res); }).catch(err => { console.error('表单验证失败:', err); }); } } }; </script> ``` 上述代码展示了如何创建一个带有两个字段(用户名和密码)的简单表单,并为其设置了基础的校验规则[^1]。 #### 自定义校验函数 对于更复杂的需求,可以通过 `validateFunction` 定义自定义校验逻辑。需要注意的是,虽然文档建议优先使用内置的方式,但在某些特殊情况下可能需要结合两者来满足需求。 示例代码如下: ```javascript methods: { customValidate(data) { const errors = {}; if (data.age && typeof data.age !== 'number') { errors.age = '年龄必须是数字'; } return errors; }, async submitForm() { try { await this.$refs.uniForms.validate(this.customValidate.bind(this)); console.log('所有校验均通过'); } catch (err) { console.error('存在未通过的校验项:', err); } } } ``` 此部分实现了针对特定字段(如年龄)进行额外类型的检查[^3]。 #### 处理多级嵌套数据结构 当遇到较为复杂的模型,比如包含数组或多层嵌套的对象,则需特别注意名称映射关系。确保每一层级路径都正确匹配到实际数据源上。 假设有一个这样的 JSON 数据结构 `{ user: { profile: { email: "" } } }`, 对应的 HTML 应该写成这样: ```html <uni-forms-item name="user.profile.email"> <uni-easyinput v-model="formData.user.profile.email" /> </uni-forms-item> ``` 同也要调整相应的 rules 设置:`'user.profile.email': {...}`. --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值