el-form 根据条件渲染部分表单校验时报错

在Vue开发中,处理动态显示隐藏的el-form-item时,v-if和v-show各有优劣。v-if在DOM树中动态增删元素,适合不频繁切换;v-show通过display控制,适合频繁切换但有较高初始渲染消耗。v-if可能导致表单校验失效,因元素未在mounted时渲染,而v-show即使隐藏仍会校验。解决方案是在v-if元素上添加key属性,避免元素复用导致的校验问题。
摘要由CSDN通过智能技术生成

1、场景
在实际工作开发中,我们在处理 el-form 表单校验问题时常会遇到这样一种情况:根据不同的条件,展示不同的 el-form-item,这个时候我们就需要考虑表单元素的显示与隐藏。在vue中,控制显示隐藏的有两个指令:v-if 和 v-show。
【1】两者不同点:v-if 是动态的向DOM树内添加或者删除 DOM 元素;v-show 是通过设置 DOM元素的 display 样式属性控制显隐;
【2】原理:v-if 切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件;v-show 只是简单的基于 css 切换;
【3】编译条件:v-if 是惰性的,如果初始条件为假,则什么也不做;只有在条件第一次变为真时才开始局部编译(编译被缓存?编译被缓存后,然后再切换的时候进行局部卸载); v-show 是在任何条件下(首次条件是否为真)都被编译,然后被缓存,而且 DOM 元素保留;
【4】性能消耗:v-if 有更高的切换消耗;v-show 有更高的初始渲染消耗;
【5】使用场景:v-if 适合运营条件不大可能改变;v-show 适合频繁切换。

2、指令的选择
【1】首先我选择使用 v-if 来控制 el-form-item 元素的显示隐藏,但是在使用过程中发现,使用 v-if来控制的 el-form-item 元素,在后续的条件切换显示中,会造成表单校验失效的问题。
【2】由于 v-if 存在表单校验失效的问题,所以后续我又尝试了使用 v-show 来控制,但是 v-show也存在一个问题,就是即使 el-form-item 元素被隐藏了,它的校验也会生效。
原因分析:
【1】使用 v-if:element 在对 form 表单中带有 prop 属性的子组件进行校验规则绑定时,是在 vue声明周期 mounted 完成的。而 v-if 用来切换的元素是会被销毁的,导致了 v-if 内的表单项,由于在 mounted 时期没有进行渲染,所以规则也没有绑定上,因此初始化时不符合显示条件的不会生成规则,导致后面切换条件,显示的输入框的校验不会生效。
【2】使用 v-show:初始化时会生成所有的规则,即使隐藏了也会进行规则校验。

3、解决
查阅相关资料后,发现一个简单粗暴的方法,即给在 v-if 的元素上加上 key 值,便能解决 v-if 带来的表单校验失效的问题,代码如下:

<el-form-item label="收货人"
      prop="CNParty.partyDescription"
      key="CNParty.partyDescription"
      v-if="goOrder.mfOrder.bookingType == 1">
      <el-input :autosize="{ minRows: 2, maxRows: 6 }"
	      type="textarea"
	      v-model="goOrder.CNParty.partyDescription"
	      name="CNParty.partyDescription">
      </el-input>
</el-form-item>


原因:因为在 v-for 或者 v-if 切换标签时,多个相同的标签被渲染,如果不添加key来区分则会出现复用的情况。而原本这些标签每一个都是独立的,所以需要添加 key 来做区分。

即使在不是 v-for 中的表单,我们经常会遇到通过条件渲染部分表单验证,并且表单之间还有联动性,比如一个勾选某个checkbox 后面会相应的显示相关部分的表单,不勾选则隐藏,校验的时候也会出问题,所以解决方法就是给每个 form-item 加上 key 属性

el-form-renderer是一个基于Element UI的表单渲染器,用于简化表单的开发和校验。而el-form-item是el-form-renderer中的一个组件,用于包裹表单项并进行校验。 在el-form-item中,可以通过rules属性来定义校验规则。rules属性是一个数组,每个元素都是一个对象,用于描述一个校验规则。每个规则对象包含以下属性: 1. required(必填):指定该字段是否为必填项,可以是一个布尔值或者一个函数。如果是函数,则根据函数的返回值来确定是否必填。 2. validator(自定义校验函数):指定一个自定义的校验函数,该函数接收三个参数:rule(当前规则对象)、value(当前字段的值)和callback(回调函数)。在自定义校验函数中,可以根据具体的业务逻辑进行校验,并通过调用callback回调函数来返回校验结果。 3. trigger(触发方式):指定触发校验的方式,默认为'change',即在字段值改变触发校验。还可以设置为'blur'(失去焦点触发校验)或'submit'(表单提交触发校验)。 4. message(错误提示信息):指定校验失败的错误提示信息。 以下是一个示例代码,展示了如何在el-form-renderer中使用el-form-item进行校验规则的定义: ```html <el-form-renderer :model="formData" :rules="formRules"> <el-form-item label="用户名" prop="username"> <el-input v-model="formData.username"></el-input> </el-form-item> </el-form-renderer> ``` ```javascript data() { return { formData: { username: '' }, formRules: { username: [ { required: true, message: '请输入用户名', trigger: 'blur' }, { min: 6, max: 12, message: '用户名长度在6到12个字符之间', trigger: 'blur' } ] } }; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值