Element plus之el-form表单验证失效+动态表单验证+多层级对象属性验证方案_elementplus表单验证不生效-程序员宅基地

技术标签: el-form  elementplus  el-form-item  vue3  element  表单验证  

期望通过每一次分享,让技术的门槛变低,落地更容易。 —— 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表单使用问题后续追加。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/visket2008/article/details/127387590

智能推荐

基于macos配置vscode下的latex环境_mac vscode latex-程序员宅基地

文章浏览阅读1k次。vscode+latex_mac vscode latex

gitee图床不能用解决方法_gitee图床不能用了-程序员宅基地

文章浏览阅读836次。配置腾讯云COS图床据了解腾讯云COS以前有50G永久免费额度,2019-01-25之后腾讯云对象存储COS免费额度作了调整,现在是50G免费六个月。进入腾讯云:点击对象存储之后创建一个桶访问权限选择公有读私有写,否则图片无法读取,其他的根据自己往下填写就可以。地域建议和你网站地区一样。密钥配置点击右上角头像进入API密钥管理,点击新建密钥进行密钥配置生成的密钥我们后面会用到。配置picgopicgo的下载以及安装在之前博客提到过,这里不再提及,直接进入配置腾讯云环节:打开_gitee图床不能用了

统一网关Gateway-程序员宅基地

文章浏览阅读1.9k次。统一网关Gateway

代替vscode的工具_8个好用的VSCode扩展工具,让你编码嗨到翻!-程序员宅基地

文章浏览阅读1.1k次。拥有合适的工具可以让你的开发工作变得更加轻松。许多开发人员使用 VSCode 作为开发工具,VSCode 允许安装各种扩展工具。【推荐:】Visual Studio Marketplace 上有太多的可用扩展工具,我们将着重介绍下面8个扩展工具。即使是最简单的工具也能赋予人们力量去做伟大的事情--比兹·斯通所有这些插件都可以在 Visual Studio Marketplace 上免费获得。1. ..._有没有免费替代vscode

SCP命令_aix scp-程序员宅基地

文章浏览阅读2.9k次。1.在A虚拟机的文件上传到B虚拟机上,使用scp命令:scp -r /zywa/jdk.tar.gz [email protected]:/root/将A虚拟机的文件jdk.tar.gz 上传到B虚拟机的/rootc目录下_aix scp

MySQL 事务隔离级别与锁机制详解_查询 mysql 事务隔离级别-程序员宅基地

文章浏览阅读6.5k次,点赞2次,收藏6次。MySQL 事务隔离级别与锁机制详解_查询 mysql 事务隔离级别

随便推点

剑指offer day5 查找算法(中等)-程序员宅基地

文章浏览阅读582次。day5题目:剑指 Offer 04. 二维数组中的查找、11. 旋转数组的最小数字、50. 第一个只出现一次的字符,知识点:数组、二分、哈希,难度为中等、简单、简单

Python网络编程报错:TypeError: a bytes-like object is required, not 'str'_报错:typeerror: a bytes-like object is required, not-程序员宅基地

文章浏览阅读1.3k次。客户端报错:TypeError: must be str, not bytes服务端报错:TypeError: a bytes-like object is required, not 'str'报错源码:'''Created on 2018年7月14日@author: dtjy'''import socketHOST='127.0.0.1'PORT=8080s=socket...._报错:typeerror: a bytes-like object is required, not 'str

npm ERR!Missing script: “dev“npm ERR!npm ERR! To see a list of scripts, run(npm run serve/dev/build)_npm err! missing script: "dev" npm err! npm err! t-程序员宅基地

文章浏览阅读7.9k次,点赞14次,收藏25次。npm 运行命令解释_npm err! missing script: "dev" npm err! npm err! to see a list of scripts, r

整合第三方媒体栈到PJSIP2.x的PJSUA-LIB_3rdparty_media_sample-程序员宅基地

文章浏览阅读1.1k次。转自:http://blog.csdn.net/tyler_xiang/article/details/61209815对PJSUA-LIB中媒体定制处理在应用中有实际意义,例如:在安卓5.x系统下,硬件编解码、视频预览等功能已被安卓封装的极其方便易用(被封得也很死),且硬件解码设置时同时设定渲染设备的surfaceview,解码后会自动渲染。视频效果很好,且不易受界面线程影响。视频预览、硬件_3rdparty_media_sample

Gentoo安装文档,教程汇总_gentoo 配置文件更新-程序员宅基地

文章浏览阅读2k次。新手安装Gentoo较复杂,首次安装应从stage3或者installcd安装,下面几个链接能够解决初步安装问题:1.Gentoo Linux x86快速安装指南http://www.gentoo.org/doc/zh_cn/gentoo-x86-quickinstall.xml2.新手 Gentoo 安装手册http://blog.chinaunix.net/space.php?_gentoo 配置文件更新

面向UE4新手----基于UE4的室内软装系统设计和实现思路_基于ue4的装修设计软件开发-程序员宅基地

文章浏览阅读7.4k次,点赞6次,收藏22次。由于一直有朋友在与我讨论关于UE4室内软装的系统设计问题,问题也都大同小异,正好类似项目有一些经验,因此在此分享给大家,希望能帮助更多UE4的新手和小团队。由于我本人是独立游戏开发者而非室内设计方向的,并且当初这个项目是基于VR的,本身需求更多一些,因此在此分享一个简化版的,通过传统键鼠操作的设计思路,抛砖引玉。后续可能还会继续更新更多相关的内容。_基于ue4的装修设计软件开发

推荐文章

热门文章

相关标签