elform-item动态prop

先来看看我这个变态而又复杂的需求!

目前自定义表单的前端开发越来越热,开发人员封装好成熟的组件,用户直接拖动生成自己的页面!这样的特点就是:

页面中显示的东西,完全是自定义组合的而不是固定的,所以此时的elform的普通prop验证已经不能满足于我们的开发要求,那如何处理呢?

以下为页面代码:form-item-layout是一个封装的组件!内部会根据会传入不同的数据model渲染出来不同的页面!如下参考!

我们来重点看看针对这种自定义表单的验证代码如何实现。

关于更多验证实现可以参考以下文章:

elform 动态 rules_el-form动态rules-CSDN博客

<el-form ref="formRefs" :model="formModel"><div v-for="item in itemList" :key="item.id"><el-form-item label="" label-width="0" :prop="i.prop" v-for="(i, index) in item.components":key="i.renderKey" :rules="[{required: true, validator: (rule, value, callback) => {}, trigger: 'blur'}]"><form-item-layout :current-item="i" :drawing-list="drawingList":form-conf="formConf" :index="index + 1" :form-style="formStyle":item-group="item" :type="true" :showPreview="true" /></el-form-item></div>
</el-form?

可以看到,对于el-from的使用仍然是能用的规则,给他定义ref,给他定义动态的model!

<el-form ref="formRefs" :model="formModel">
data() {return {formModel:{}};},

而针对el-from-item的prop指定就显示的尤其特别,prop为空,则意味着不需要验证,不为空则意味着需要验证!

<el-form-item label="" label-width="0" :prop="i.prop" 
v-for="(i, index) in item.components"

 :prop=i.prop这句是精华,重中之重。

然后向原始数据中渗入prop属性,这里为什么要调用replaceAll()函数呢?因为我们后端给我返回的

p.component.vModel值为"v.model.242342342"这样的字符串,在strict模式下,这被认为是一个对象的深入节点访问!当然你可以直接p的某一个属性,如id或者是不包括点号的属性保持唯一即可。但一定要与数据对应因为后面的验证规则中需要通过这个唯一值来访问动态数据中的提示语言文字!而最后this.$set(this.formModel,p.prop,'')更是不能替换this.formModel = p.prop,否则是不生效的。

p.prop = p.component.vModel.replaceAll('.','')
this.$set(this.formModel,p.prop,'')

最后一步则简单多了,实现rules方法进行验证即可,我们是行间实现验证规则,你也可以参考下面的函数中验证规则,均可。

一、行间验证

:rules="[
{required: true, validator: (rule, value, callback) => {debugger}, trigger: 'blur'
}]"

根据回调中field遍历我们的数据源,找到相应的数据,根据规则进行验证提示即可。

最终行间验证完整代码如下:

<el-form-item label="" label-width="0" :prop="i.prop" v-for="(i, index) in item.components"
:key="i.renderKey" :rules="[{required: true, validator: (rule, value, callback) => {if (!value && value.length === 0){callback(i.component.placeholder)}else{callback()}}, trigger: 'blur'}]"><form-item-layout :current-item="i" :drawing-list="drawingList":form-conf="formConf" :index="index + 1" :form-style="formStyle":item-group="item" :type="true" :showPreview="true" />
</el-form-item>

一般函数内写法为:

callback(new Error('请选择CRF模板'));
而此处行间验证写法为:
callback('请选择CRF模板');

二、动态绑定验证函数 


this.itemList.map((item)=>{let rulesList = []const validator = (rule,value,callback)=>{//实现你的验证逻辑if (!value && value.length === 0){return callback(new Error(item.component.placeholder));}}rulesList.push({validator:validator,trigger: "blur"})this.rules[item.prop]=rulesList
})

我最终实现验证的同时配合self.$nextTick滚动到未输入的表单处!体验更好。采用函数式验证!因为行间验证无法调用document.getElementsByClassName('el-form-item__error')

完整代码为:

data() {return {formModel:{},formRules:{}};},
<el-form ref="formRefs" :model="formModel" :rules="formRules"><div v-for="item in itemList" :key="item.id"><el-form-item label="" label-width="0" :prop="i.prop" v-for="(i, index) in item.components":key="i.renderKey"><form-item-layout :current-item="i" :drawing-list="drawingList":form-conf="formConf" :index="index + 1" :form-style="formStyle":item-group="item" :type="true" :showPreview="true" /></el-form-item></div>
</el-form?
p.prop = p.component.vModel.replaceAll('.','')
self.$set(self.formModel,p.prop,'')let rulesList = []
const validator = (rule,value,callback)=>{if (!value && value.length === 0){let text = p.component.placeholder?p.component.placeholder:'数据不能为空'self.$nextTick(function(){let errList = document.getElementsByClassName('el-form-item__error')if (errList && errList.length > 0){errList[0].scrollIntoView({// 滚动到指定节点// 值有start,center,end,nearest,当前显示在视图区域中间block: 'center',// 值有auto、instant,smooth,缓动动画(当前是慢速的)behavior: 'smooth',})}})return callback(new Error(text));}
}
rulesList.push({validator:validator,trigger: "blur"})
self.formRules[p.prop]=rulesList

页面验证效果:

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多门店自助点餐+外卖二合一小程序源码系统 带完整搭建教程

随着餐饮业的快速发展和互联网技术的不断进步&#xff0c;越来越多的餐厅开始采用自助点餐和外卖服务。市场上许多的外卖小程序APP应运而生。下面罗峰来给大家介绍一款多门店自助点餐外卖二合一小程序源码系统。该系统结合了自助点餐和外卖服务的优势&#xff0c;为餐厅提供了一…

如何在在线Excel文档中对数据进行统计

本次我们将用zOffice表格的公式与数据透视表分析样例&#xff08;三个班级的学生成绩&#xff09;。zOffice表格内置了大量和Excel相同的统计公式&#xff0c;可以进行各种常见的统计分析&#xff0c;如平均值、标准差、相关性等。同时&#xff0c;zOffice也有数据透视表功能&a…

IDEA取消git对项目的版本控制

前言 前几天新建项目的时候不小心选了个git仓库&#xff0c;导致这个测试项目一直被git管理着。 解决办法 1 右键项目 选择打开资源目录 2 删除.git文件 把目录下的.git文件删掉 3 删除idea中的git管理 删除完.git文件后&#xff0c;进入idea&#xff0c;右下角会有这样的提…

【Node.js入门之—1.2 部署Node.js开发环境】

Node.js入门之—1.2 部署Node.js开发环境 在 Windows 系统上安装 Node.js 两种文件格式的安装包 Windows安装包&#xff08;.msi&#xff09;Windows二进制文件&#xff08;.exe&#xff09;安装包 检查Node.js版本 node --version 在 Linux 系统上安装 Node.js Linux操…

[黑马程序员Pandas教程]——Pandas常用计算函数

目录&#xff1a; 学习目标排序函数 sort_values函数rank函数常用聚合函数 corr函数计算数值列之间的相关性min函数计算最小值max函数计算最大值mean函数计算平均值std函数计算标准偏差quantile函数计算分位数sum函数求和count计算非空数据的个数其他常用计算函数 round改变浮…

Ansible 自动化运维工具 --- playbook 剧本

文章目录 1. Host inventory ---- 主机清单1.1 简介1.2 inventory文件1.3 Inventory 文件的构成1.3.1 主机与组1.3.2 变量 1.4 inventory 中的常用变量 2. Ansible-playbook剧本2.1 简介2.2 Playbook的结构组成2.3 编写playbook的基本格式与写法2.3.1 基本格式2.3.2 语句的横向…

持续集成交付CICD:Jenkins Pipeline与远程构建触发器

目录 一、实验 1.Jenkins Pipeline本地构建触发器 2.Jenkins Pipeline与远程构建触发器&#xff08;第一种方式&#xff09; 3.Jenkins Pipeline与远程构建触发器&#xff08;第二种方式&#xff09; 4.Jenkins Pipeline与远程构建触发器&#xff08;第三种方式&#xff0…

基于Skywalking的全链路跟踪实现

在前文“分布式应用全链路跟踪实现”中介绍了分布式应用全链路跟踪的几种实现方法&#xff0c;本文将重点介绍基于Skywalking的全链路实现&#xff0c;包括Skywalking的整体架构和基本概念原理、Skywalking环境部署、SpringBoot和Python集成Skywalking监控实现等。 1、Skywalki…

ubuntu 20.04 server安装

ubuntu 20.04 server安装 ubuntu-20.04.6-live-server-amd64.iso 安装 安装ubuntu20.04 TLS系统后&#xff0c;开机卡在“A start job is running for wait for network to be Configured”等待连接两分多钟。 cd /etc/systemd/system/network-online.target.wants/在[Servi…

MF-SuP-pKa

子图层面的图网络预测pKa&#xff0c;使用了数据增强和迁移学习&#xff0c;原文&#xff1a;MF-SuP-pKa: Multi-fidelity modeling with subgraph pooling mechanism for pKa prediction&#xff0c;代码 MF-SuP-pKa&#xff0c;原文框架如下&#xff1a;

Python TCP服务端多线程接收RFID网络读卡器上传数据

本示例使用设备介绍&#xff1a;WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) #python通过缩进来表示代码块&#xff0c;不可以随意更改每行前面的空白&#xff0c;否则程序会运行错误&#xff01;&#xff01;&#xff01;如果缩进不…

Vue2基础-Vue对象介绍

文章目录 一、概念特点举例 二、模板语法插值语法指令语法v-bind数据绑定 三、组件el和data的两种写法 四、MVVM模型五、数据代理六、事件处理基本使用事件修饰符键盘按键 七、计算属性八、监听属性普通监视深度监视监视简写 九、监听与计算总结 一、概念 一套用于构建用户界面…