Element plus之el-form表单验证失效+动态表单验证+多层级对象属性验证方案

本文详细探讨了Vue3+ElementPlus项目中遇到的表单验证问题,包括验证失效的常见原因及解决方案,如ref、model、prop的正确使用。此外,还讲解了如何处理多层级对象属性验证,以及动态表单验证列的实现思路。通过实例代码,帮助开发者降低技术门槛,使表单验证更易落地。
摘要由CSDN通过智能技术生成

期望通过每一次分享,让技术的门槛变低,落地更容易。 —— around

目录

  • 1.表单验证问题
  • 2.多层级对象属性验证
  • 3.动态表单验证列

前言

旨在解决项目过程中遇到触发el-form验证失效,多级对象属性如何编写验证规则,动态表单控件如何处理。项目web端使用的是vue3+element plus,下面代码介绍等相关内容均以vue3+ts语法描述。

正文

样例如下代码所示,已贴全部代码,后续说明以该代码所示

<template>
  <div class="system-add-message-container">
    <el-dialog title="加入 面试管理-已邀约" v-model="isShowDialog" width="500px">
      <el-form ref="userFormRef" :model="ruleForm" :rules="rules" size="default" label-width="110px">
            <el-form-item label="归属人" prop="belonger">
              <el-input v-model="ruleForm.belonger" disabled></el-input>
            </el-form-item>
            <el-form-item label="面试时间" prop="child.interviewTime">
              <el-date-picker class="w100" v-model="ruleForm.child.interviewTime" type="datetime" placeholder="请选择面试时间" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" />
            </el-form-item>
      </el-form>
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="onCancel" size="default">取 消</el-button>
          <el-button v-loading="loading" type="primary" @click="onSubmit" size="default">提 交</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>

<script lang="ts">
import { reactive, toRefs, onMounted, defineComponent, ref, getCurrentInstance } from 'vue';
import { recruimentApi } from '/@/api/recruiment/recruiment';
import { storeToRefs } from 'pinia';
import { useUserInfo } from '/@/stores/userInfo';

export default defineComponent({
	name: 'copyUser',
	setup(props, context) {
		const { proxy } = <any>getCurrentInstance();

		const stores = useUserInfo();
		const { userInfos } = storeToRefs(stores);
		const userFormRef = ref();
		const belongerIdRef = ref();
		const state = reactive({
			loading: false,
			isShowDialog: false,
			ruleForm: {
				belonger: '', //归属人
				child: {
					interviewTime: '',
				},
			},
			belongerData: [], //初始化数据
			selectRow: {} as any, //选中行对象
			positionOptions: [] as any[],
			rules: {
				positionId: [{ required: true, message: '请选择岗位', trigger: 'blur' }],
				child:{
				    interviewTime: [{ required: true, message: '请选择面试时间', trigger: 'blur' }],
				},
			},
		});

		// 打开弹窗
		const openDialog = (row: any) => {
			state.ruleForm = {
				belonger: '', //归属人
				child: {
					interviewTime: '',
				},
			};
		};

		// 新增
		const onSubmit = async () => {
			state.loading = true;
			proxy.$refs['userFormRef'].validate(async (valid: any) => {
				if (valid) {
					//验证通过
				}
				state.loading = false;
			});
		};

		return {
			userFormRef,
			belongerIdRef,
			openDialog,
			onSubmit,
			...toRefs(state),
		};
	},
});
</script>

1.表单验证失效问题

通常表单验证失效有三类原因,ref名称不对、model绑定有问题、prop编写错误,正确写法见下挨个检查即可保证是正确的。

<el-form ref="userFormRef" :model="ruleForm" :rules="rules">
   <el-form-item label="归属人" prop="belonger">
      <el-input v-model="ruleForm.belonger" disabled></el-input>
   </el-form-item>
</el-form>
  • model
    需要注意的是,在绑定el-form表单属性时,请使用:model而不是使用v-model
  • prop
    属性用作el-form-item标签,需要注意的是它将直接绑定属性名,原则上按照顶级为model绑定对象,依次填写下级需要参与验证的属性名即可,这里额外要注意的是,对于超过2层级的对象属性封装,需要保持:model与:rules的属性名同层级关系
    在这里插入图片描述
  • ref
    1. el-form的ref属性声明的名称为字符串上述值为ref="userFormRef",在el-form表单验证时,方法为如下内容,注意$refs['userFormRef']部分直接使用的是字符串填写模式
      proxy.$refs['userFormRef'].validate(async (valid: any) => {
      	if (valid) {
      		//验证通过
      	}
      	state.loading = false;
      });
      
    2. 另一种方式为传参调用形态,依旧保持el-form声明ref="userFormRef",需要通过方法进入表单提交,本方式适用于多el-form动态验证的模式。注意看下面的按钮click事件onSubmit('userFormRef'),将ref的字符串声明传递进入提交方法,通过方法传参formName与表单验证方法绑定完成指定表单验证
      <el-button @click="onSubmit('userFormRef')" size="default">提 交</el-button>
      ......
      const onSubmit = async (formName: string) => {
      	proxy.$refs[formName].validate(async (valid: any) => {
      		if (valid) {
           //验证成功
      		}
      	});
      };
      

综上,100%可以解决<el-form>表单验证功能失效的问题。

2.多层级对象属性验证

form绑定的model结构如下:

ruleForm: {
	belonger: '', 
	child: {
		interviewTime: '',
	},
},

如上图,需要对interviewTime属性对应空间添加表单校验,页面控件绑定prop="interviewTime"已经是不正确的了,由于:model="ruleForm",默认填写下面一层关系的属性名可以直接写,但多层级必须带上除ruleForm外的完整路径,应是child.interviewTime,同时在调整rules中的层级结构,否则无法生效,参考下面正确结果

<el-form-item label="面试时间" prop="child.interviewTime">
  <el-date-picker v-model="ruleForm.child.interviewTime" type="datetime" />
</el-form-item>

form绑定的rules结构如下:

rules: {
	belonger: [{ required: true, message: '请选择', trigger: 'blur' }],
	child:{
	    interviewTime: [{ required: true, message: '请选择面试时间', trigger: 'blur' }],
	},
},

3.动态表单验证列

本功能还未做完,但这样应该是可行的,可以直接在产生动态表单的el-form-item中设置prop为传参形态,见下文

<el-form-item :prop="{'start'+state.index + 'Count'}">

后续在对应的rules中以初始化方式同样更新迭代一次赋值结果集,即可保证form表单支持动态属性名的校验。

更多el-form表单使用问题后续追加。

可以使用Vue3中内置的v-model以及element-plus中提供的el-formel-form-item组件,设置相应的验证规则和提示信息即可。 示例代码如下: ```html <template> <el-form ref="form" :model="formData" :rules="formRules"> <el-form-item label="用户名" prop="username"> <el-input v-model="formData.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input v-model="formData.password" type="password"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm">提交</el-button> </el-form-item> </el-form> </template> <script> import { ref } from 'vue'; import { ElMessage } from 'element-plus'; export default { name: 'FormValidation', setup() { const formData = ref({ username: '', password: '', }); const formRules = ref({ username: [{ required: true, message: '请输入用户名', trigger: 'blur', }], password: [{ required: true, message: '请输入密码', trigger: 'blur', }], }); const submitForm = () => { // 提交表单操作 const form = ref('form'); form.value.validate((valid) => { if (valid) { // 验证通过执行提交操作 ElMessage.success('提交成功'); } else { ElMessage.warning('请填写完整信息'); return false; } }); }; return { formData, formRules, submitForm, }; }, }; </script> ``` 在这个示例中,我们使用了ref来创建响应式对象formData和formRules,formData用于存放表单数据,formRules用于存放表单的验证规则。 el-form组件作为表单容器,通过ref="form"指定参考名称,然后通过:model绑定formData数据模型,用:rules绑定表单验证规则。 el-form-item组件作为表单元素的包裹容器,通过label属性指定标签文字,再使用prop属性命名表单元素的key,与表单验证规则对应。 验证规则定义可包括以下属性: - required:表示是否为必填字段 - message:表示验证不通过时的提示信息 - trigger:表示触发验证的事件,默认为blur 最后,在提交表单时,我们使用validate方法对表单进行验证,需要在回调函数中判断验证结果并作出相应操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值