el-form嵌套el-table编辑,校验信息显示在气泡框中

news2024/11/22 17:17:58

文章目录

    • 概要
    • 整体架构流程
    • 技术名词解释
    • 技术细节

概要

提示:这里可以添加技术概要
正常情况下,el-table可编辑表格,如果输入框内容不合理的情况下,错误提示会显示在el-input下方对应。

但是,我不得不将错误提示放到el-tooltip中显示,因为产品给出的校验失败信息实在是太太太太太长长长长长长了!!!
其余“必填”,“请输入整数”之类的常见语句咱就不说了,来感受一下表单项的超长校验不通过提示:

由英文字母开头,只能包含英文字母、数字和下划线,最长32位,不能以下划线结尾

这句话放到表单里还舒展得开,但领导要求不允许另开弹框,只能在表格里编辑。表格列只有那么宽,表中还有那么多项,强制塞进去后,一行内各个不通过的校验提示开始打架:
①错误校验提示被其他列截断遮挡
②强制调整.el-form-item__error的宽度,错误校验提示底部文字被下一行tr遮挡
③设置定位,控制.el-form-item__error不被遮挡,该校验下一项也不通过时,这个超长校验提示戳到了下一个校验文字的脸上
((ˉ▽ˉ;)…)

整体架构流程

为了方便举例这里只放一个表单项说明

假设需要为学生录入信息,其中有一项是学生标识,要求该标识的命名规则为:由英文字母开头,只能包含英文字母、数字和下划线,最长32位,不能以下划线结尾
html部分:

<template>
 <div>
 	<el-form :inline="true" :model="stuForm" ref="stuForm">
		<el-table :data="stuForm.stuData" @row-click="getRow" @current-change="clickCurrent" tooltip-effect="light">
			<el-table-column prop="code" label="标识:" align="center" :show-overflow-tooltip="true">
				<template v-slot="scope">
					<div class="edit-table">
						<!--编辑部分-->
						<el-form-item v-show="scope.row.isEdit" 
						:prop="'stuData.'+scope.$index+'.code'" 
						:rules="[{validator:(rule,value,callback)=>{checkCodeValue(rule,value,callback,scope.row)}}]">
							<el-tooltip 
							:disabled="scope.row.ms1&&scope.row.ms2"
							:content="scope.row.ms1?errorMess1:errorMess2"
							 placement="top" effect="light">
								<el-input v-model="scope.row.code" @blur="subRow(scope.$index,scope.row)"/>
							</el-tooltip>
						</el-form-item>
						<!--展示部分-->
						<el-tooltip :content="scope.row.code" placement="top" effect="light">
							<span v-show="!scope.row.isEdit" 
							 class="long-data-show">{{scope.row.code}}</span>
						</el-tooltip>
					</div>
				</template>
			</el-table-column>
		</el-table>
	</el-form>
 </div>
</template>

js处理:

<script>
export default {
	data(){
		return {
			errorMess1:"由英文字母开头,只能包含英文字母、数字和下划线,最长32位,不能以下划线结尾",
			errorMess2:"必填项不能为空",
			stuForm:{stuData:[]},//学生信息列表
		}
	},
	mounted(){this.loadData()},//初始化加载后台数据
	methods:{
		loadData(){
			//假设如下是获取学生信息的接口,加载后端分页第一页数据,每页10条
			//getStudentData({page:1,size:10}).then(res => {
				//初始化需要自己处理下数据,添三个属性
				let res = {data:[{code:'abc'},{code:'efg'}]}//模拟接口数据
				this.stuForm.stuData = [];
				//isEdit=是否显示输入框,ms1对应32位校验是否显示错误信息,ms2对应非空校验是否显示错误信息
				this.stuForm.stuData = res.data.map(item => {return {...item,isEdit:false,ms1:true,ms2:true}})
			//})
		},
		checkCodeValue(rule,value,callback,row){//表单项单独校验处理
			let reg = /^[a-zA-Z]([a-zA-Z0-9_]{0,30}[a-zA-Z0-9])?$/;
			if(value === null || (value.toString().length === 0)){//非空校验
				row.ms1 = false;//非空不通,将另一32校验设为false,使disabled失效
				row.ms2= true;//非空不通,显示内容为非空校验错误提示,对应errorMess2
				callback(new Error(" "))//el-form自带提示处空白占位
			} else {//32位格式校验
				//同以上原理:都通,均设true使disabled触发;32校验不通,显示32校验的错误信息
				reg.test(value) ? (row.ms1 = true, row.ms2 = true, callback())
				:(row.ms1 = true, row.ms2 = false, callback(new Error(" ")));
			}
		},
		//其余辅助功能
		//点击表格其余行,关闭上次操作行的编辑框(可选择)
		clickCurrent(n,o){//对应newValue,oldValue,不明白可以去看下官网
			if(o)//o.isEdit = false;//直接关闭上一行编辑状态,或者:(看下一行)
			//下面这行看个人要求,如果想要校验规则不通过的行保持编辑状态,可额外加条件限制
			if(o.code.trim().length!==0)o.isEdit = false;
		},
		getRow(row){//点击表格行,点击的这行开启编辑输入框状态
			row.isEdit = true;
		},
		//某行失去焦点时提交这行内容给后台,前提是这行所有输入项校验通过
		validateRow(form,index){//目标行校验,这里单独拎出一个方法
			let result = true;
			for(let item of this.$refs[form].fields){//注意:如果是vue3,这里会报错,需要想别的办法
				if(item.prop.split(".")[1] == index){//注意:这里是”==“而不是”===“,如果项目采用严格模式,需要用number转换一下
					this.$refs[form].validateField(item.prop,err => {
						if(err.length)result = false;
					})
				}
				if(!result)break;
			}
			return result;
		},
		subRow(index,row){
			if(!this.validateRow("stuForm",index))return;//如果该行校验不通过,拒绝提交
			//subOne({code:row.code}).then(res => {//提交信息接口
				alert('提交成功') 
			//}).catch(er=>{row.isEdit = true})//如果接口反馈失败,保持输入状态方便识别刚刚编辑的行
			
		}
	}
}
</script>

技术名词解释

列表行处理用到的组件内置属性和方法:

1、@row-click : 点击tr触发。此处用来将点击的行变为编辑状态
2、@current-change : 当前行发生变化时触发。此处用来(视情况)关闭上一行的编辑状态
3、tooltip-effect="light":show-overflow-tooltip="true" : 这两个配合使用,当el-table单元格内容超长时,鼠标移入以弹出气泡方式展示超长内容
4、effect="light" : 气泡样式,有黑白两种
5、@blur : 输入框失去焦点时触发。此处用来触发整行校验


技术细节

关于校验单独某行的方法:

validateRow(form,index){
	let result = true;
	for(let item of this.$refs[form].fields){
		if(item.prop.split(".")[1] == index){
			this.$refs[form].validateField(item.prop,err => {
				if(err.length)result = false;
			})
		}
		if(!result)break;
	 }
	return result;
},

1、item.prop获取到的数据格式:
第一行:stuData.0.code
第二行:stuData.1.code
第三行:stuData.2.code

总之,中间的索引对应数据在列表中的行索引,具体根据表单中绑定的:prop="'stuData.'+scope.$index+'.code'" 而来

2、注意:如果在vue3+element-plus的情况下,this.$refs[form].fields会运行报错undefined,打印监听后发现,高版本和低版本打印的this.$refs.form结果不相同,暂无解决方法。区别如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/600557.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python几行几列是什么?

Python几行几列是什么&#xff1f; Python几行几列是一款基于Python语言开发的优秀的划线工具。这个工具能够帮助开发者轻松创建、管理和分享自己的Python代码。Python几行几列是一款高效、易用的Python编辑器&#xff0c;它既可以用于快速编写Python代码&#xff0c;也可以用…

PG数据库 column “has_submit_am“ is of type numeric but expression is of type bool

目录 场景&#xff1a; 现象&#xff1a; 复盘分析&#xff1a; 解决方法&#xff1a; 测试&#xff1a; 扩展&#xff1a; 场景&#xff1a; 今天遇到一个问题&#xff0c;现场数据库中做了boolean隐式转换smallint时在执行对应的插入时一直报错 column "has_submit…

【Python NLTK】零基础也能轻松掌握的学习路线与参考资料

Python 自然语言处理工具包&#xff08;Natural Language Toolkit&#xff0c;简称 NLTK&#xff09;是一款 Python 的库&#xff0c;主要用于处理自然语言的相关问题&#xff0c;如文本清洗、标记化、分词、语义分析、词性标注、文本分类等功能&#xff0c;是数据科学家和机器…

Facebook不同账户类型的投放格式【Facebook企业户】

在Facebook企业户中&#xff0c;不同的广告类型具有多样化的投放格式&#xff0c;旨在帮助企业更好地吸引目标受众、提升品牌曝光和实现营销目标。 一、广告类型的概述 Facebook提供了多种广告类型&#xff0c;包括图片广告、视频广告、幻灯片广告、动态产品广告等。每种广告类…

vue项目H5页面在苹果手机点击输入框输入内容时 页面自动放大

遇到的问题 用vue写H5页面时,iPhone手机点击input搜索框,输入内容时,页面会自动放大。 解决方法 在public文件夹下找到html文件&#xff0c;打开后加上user-scalableno 就行 <meta name"viewport" content"widthdevice-width,initial-scale1.0,user-scala…

【从零开始进行高精度手眼标定 eye in hand(小白向)1 原理推导】

从零开始进行高精度手眼标定 eye in hand&#xff08;小白向&#xff09;1 原理推导 前言原理推导公式推导为什么在数据采集中至少需要两个位姿信息 MATLAB编程计算A矩阵的计算和获取matlab计算代码B矩阵的计算和获取matlab计算矩阵B 前言 最近由于组内的相关工作需求&#xf…

pytorch中Dataset、Dataloader、Sampler、collate_fn相互关系和使用说明

参考&#xff1a; https://blog.csdn.net/Chinesischguy/article/details/103198921 参考&#xff1a; https://zhuanlan.zhihu.com/p/76893455 参考&#xff1a;https://blog.csdn.net/lilai619/article/details/118784730 参考&#xff1a;https://pytorch.org/docs/stabl…

06 【Vue数据监视 v-model双向绑定】

1.Vue数据监视 1.1 问题演示 先来个案例引入一下&#xff1a; <!-- 准备好一个容器--> <div id"root"><h2>人员列表</h2><button click"updateMei">更新马冬梅的信息</button><ul><li v-for"(p,inde…

Markdown笔记应用程序Note Mark

什么是 Note Mark Note Mark 是一种轻量、快速、简约&#xff0c;基于网络的 Markdown 笔记应用程序。具有时尚且响应迅速的网络用户界面。 安装 在群晖上以 Docker 方式安装。 ghcr.io 镜像下载 官方的镜像没有发布在 docker hub&#xff0c;而是在 ghcr.io&#xff0c;所以…

总结了几百个ChatGPT模型的调教经验,确定不来看看?

目录 前言 chatgpt调教指南 提示词 1.清晰的问题或请求&#xff1a; 2.上下文设置&#xff1a; 3.具体的主题或领域&#xff1a; 4.陈述性问题&#xff1a; 5.追问和澄清&#xff1a; 6.限定问题范围&#xff1a; 角色扮演 充当 Linux 终端 担任产品经理 充当 SQL…

技术帖——飞凌嵌入式RK3588开发板推理模型转换及测试

RKNN&#xff08;Rockchip Neural Network&#xff09;是一种用于嵌入式设备的深度学习推理框架&#xff0c;它提供了一个端到端的解决方案&#xff0c;用于将训练好的深度学习模型转换为在嵌入式设备上运行的可执行文件。使用RKNN框架可以在嵌入式设备上高效地运行深度学习模型…

易基因:DNA羟甲基化和TET酶在胎盘发育和妊娠结局中的作用 | 深度综述

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 胎盘是支持哺乳动物胚胎和胎儿发育所必需的临时器官。了解滋养层细胞分化和胎盘功能的分子机制可能有助于改善产科并发症的诊断和治疗。印迹基因是调控胎盘发育的基础&#xff0c;表观遗…

chatgpt赋能python:使用Python编写数据接口:如何让您的网站更具吸引力和效率

使用Python编写数据接口&#xff1a;如何让您的网站更具吸引力和效率 在当今数字时代&#xff0c;大多数公司都希望能够从用户生成的数据中收集和分析信息&#xff0c;以了解他们的客户群体并提高他们的营销策略。为此&#xff0c;开发数据接口成为了一项对于互联网公司不可或…

新文本检测算法TextFuseNet

TextFuseNet: Scene Text Detection with Richer Fused Features 自然场景中任意形状文本检测是一项极具挑战性的任务&#xff0c;与现有的仅基于有限特征表示感知文本的文本检测方法不同&#xff0c;本文提出了一种新的框架&#xff0c;即 TextFuseNet &#xff0c;以利用融合…

网络开发过程详细知识点

网络生命周期至少包括系统构思与计划、分析和设计、运行和维护的过程。 常见的迭代周期分为四阶段周期、五阶段周期、六阶段周期。 网络开发过程根据五阶段迭代周期模型可被分为五个阶段&#xff1a; 需求分析、现有网络分析、确定网络逻辑结构、确定网络物理结构、安装与维护。…

linux实践php8.2加laravel-cotane和swoole服务器

php8.2 composer -v 报错&#xff1a; Deprecation Notice: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in phar:///usr/bin/composer/vendor/symfony/console/Descriptor/TextDescriptor.php:290 解决方法可以升级下composer&#xff1…

计算机中小数的存储

十进制小数怎么转成二进制小数&#xff1f;怎么在计算机中存储float&#xff1f; 计算机中存储的二进制小数&#xff08;float&#xff09;怎么转成十进制小数&#xff1f;

法规标准-ISO 20900标准解读

ISO 20900是做什么的&#xff1f; ISO 20900全名为智能交通系统-部分自动泊车系统(PAPS)-性能要求和试验程序&#xff0c;其中主要是对PAPS系统的功能要求、性能要求及测试步骤进行了介绍 PAPS类型 I类型PAPS系统反应 II类型PAPS系统反应 一般要求 运行期间的最大速度 系统…

05 【绑定样式 条件渲染 列表渲染】

1.绑定样式 1.1 class样式 写法 :classxxx xxx可以是字符串、对象、数组。 所以分为三种写法:字符串写法、对象写法、数组写法。 1.1.1 字符串写法 字符串写法适用于: 类名不确定,要动态获取 <style>.normal{background-color: skyblue;} </style><!-- 准备…

DeSTSeg:用于异常检测的分割网络引导去噪学生教师模型(CVPR2023)

文章目录 DeSTSeg: Segmentation Guided Denoising Student-Teacher for Anomaly Detection摘要本文方法Synthetic Anomaly GenerationDenoising Student-Teacher Network分割网络推理 实验结果消融实验 DeSTSeg: Segmentation Guided Denoising Student-Teacher for Anomaly D…