uview下表单动态校验的问题

一、前言

最近开发网格小程序,其中涉及到动态添加家属,对表单进行动态校验问题,但uview没办法实现,后面参照其他博客和自己的理解,终于解决了此问题。

动态表单效果图

二、解决方案

1、动态使用,v-for需要放在u-form下的view下面

在这里插入图片描述

2、rules和表单model下面放置一个同名数组

在这里插入图片描述

3、修改uview中的源码

在 validateField 方法中修改如下
源码:

// 属性链数组
const propertyChain = child.prop.split(".");
const propertyName =
	propertyChain[propertyChain.length - 1];

const rule = this.formRules[child.prop];
// 如果不存在对应的规则,直接返回,否则校验器会报错
if (!rule) return;
// rule规则可为数组形式,也可为对象形式,此处拼接成为数组
const rules = [].concat(rule);

修改后:

// 属性链数组
const propertyChain = child.prop.split(".");
const propertyName =
	propertyChain[propertyChain.length - 1];
//修改:将const改为let 
let rule = this.formRules[child.prop];
//修改:链式是无法通过上面的方式获取的,改为下面的方式
if(!rule){
	rule=uni.$u.getProperty(
	this.formRules,
	child.prop
	);

}
// 如果不存在对应的规则,直接返回,否则校验器会报错
if (!rule) return;

4、动态添加数据

//添加家属
addRelation() {
	if(!this.houseInformation.isChange) return;
	if(this.houseInformation.userList.length && !this.houseInformation.userList?.[this.houseInformation.userList.length-1]?.relation){
		uni.$showMsg('请先选择上一个的户主关系')
		return
	}
	
	let relation = {
		identityNumber:'',
	  userName: '',
	  userBirthday: '',
	  userSex: '',
	  relation: '',
	  userTel: '',
	  personnelId:''
	}
	this.houseInformation.userList.push(relation);
	this.rules.userList.push(this.relationRules);
	this.$refs.houseInformation.setRules(this.rules)

},

在这里一定要注意:添加的relation 一定要用变量申明,而不要放在data里面,否则会出现引用地址一致,导致表单与表单之间的校验混乱情况。

三、总结

前端基础一定要打牢,有机会还是看一些源码提升自己!!!

### 解析 uView uni-app 表单验证规则失效解决方案 #### 设置表单校验规则 对于`u-view`中的表单组件,确保在页面加载完成后立即设置表单校验规则是非常重要的。这可以通过监听生命周期钩子函数`mounted()`来完成,在该阶段可以访问到已经挂载好的DOM元素以及组件实例。 ```javascript export default { data() { return { formData: {}, // 表单数据对象 rules: {} // 验证规则定义 } }, methods: {}, mounted() { this.$nextTick(() => { if (this.$refs.uForm) { this.$refs.uForm.setRules(this.rules); } }); } } ``` 上述代码片段展示了如何利用`$nextTick`等待视图更新完毕后再调用`setRules`方法[^2]。 #### 初始化赋值后的处理 当涉及到表单字段初始值设定的情况时,需要注意的是,如果是在创建组件之前就给这些字段赋予了特定值,则可能导致某些情况下校验逻辑未能正常工作。因此建议先清空原有值再重新绑定新的模型数据,并再次触发一次完整的渲染过程以确保所有状态同步一致。 ```html <u-form ref="uForm" :model="formData" :rules="rules"> <!-- form items --> </u-form> ``` ```javascript methods: { resetFormDataAndValidate() { Object.assign(this.formData, {}); setTimeout(() => { this.$forceUpdate(); this.validateForm(); }, 0); }, validateForm() { this.$refs.uForm.validate(valid => { console.log('validate result:', valid); }) } }, created() { // 假设这里获取到了服务器端返回的数据并希望将其作为表单默认值显示出来 const serverData = {}; Object.assign(this.formData, serverData); // 调用重置与验证的方法 this.resetFormDataAndValidate(); } ``` 这段JavaScript代码说明了怎样安全地初始化表单数据并且随后立刻执行一次手动验证操作[^3]。 #### 组件内部自定义事件响应 另外值得注意的一点是,有时候即使按照官方文档指导完成了相应配置仍然会碰到问题。此时不妨考虑是否存在其他因素干扰了正常的流程运转——比如是否有第三方插件修改过全局配置?或者是父级容器传递下来的props参数影响到了当前组件的行为表现? 为了排查此类潜在冲突,可以在组件内注册一些额外的日志记录语句用于监控关键节点的变化情况: ```javascript watch: { '$route'(to, from) { console.debug('[Route Change]', to.path); }, formData: { handler(newValue, oldValue){ console.info(`[Form Data Changed]\nNew Value:\n${JSON.stringify(newValue)}\nOld Value:\n${JSON.stringify(oldValue)}`); }, deep: true, } } ``` 以上措施有助于更清晰地了解整个应用运行期间的状态变迁轨迹,从而更快定位具体原因所在。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值