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

页面验证效果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot和spring对比

spring的出现 大家都知道spring是大概2003年左右开始出现流行的&#xff0c;是一个轻量级的Java 开发框架&#xff0c;它是为了解决企业应用开发的复杂性而创建的。Spring 的核心是控制反转&#xff08;IoC&#xff09;和面向切面编程&#xff08;AOP&#xff09;。Spring 是可…

pandas 获取一段时间内每个月的最后一个工作日和日历日

获取一段时间内每个月的最后一个工作日 endlistpd.date_range(start‘2023-01-01’, end‘2023-09-30’, freq‘BM’).strftime(“%Y-%m-%d”).to_list() 获取一段时间内每个月的最后一个日历日 endlistpd.date_range(start‘2023-01-01’, end‘2023-09-30’, freq‘M’).st…

样式问题解决

1.深度样式选择器 1.vue2中 原生css >>> .el-card__header saas\scss ::v-deep .el-card__header less /deep/ .el-card__header 2.vue3中 :deep() { //styles } ::deep() { //styles } 2.修改element.style样式 3.用户代理样式表样式修改 用户代理样式表是浏…

使用jmeter进行简单压力测试

前言 最近项目要上线,需要项目进行简单的压力测试,本次使用的是jmeter来进行的,由于本人不是专业测试,只是对本次使用过程进行简单的记录. 一.jemeter的下载与安装 我这个已经安装很久了,具体过程这个可以查询下其他博客(偷个懒). 二.使用过程 1.测试计划右击-添加(add)-线…

重生奇迹MU套装大全中的极品属性

在重生奇迹MU之中&#xff0c;你不能如其他游戏一般只看攻击与防御&#xff0c;你更要看属性&#xff0c;这才是重生奇迹中的王道&#xff01;属性好&#xff0c;才是极品&#xff0c;属性不佳&#xff0c;即便攻击、防御再出色&#xff0c;也只能沦落成为一件替用品&#xff0…

Leetcode—2300.咒语和药水的成功对数【中等】

2023每日刷题&#xff08;二十五&#xff09; Leetcode—2300.咒语和药水的成功对数 排序二分实现代码 class Solution { public:int lower_bound(vector<int> &potions, long long target) {int n potions.size();int left 0, right n;int mid left (right -…

如何快速编写测试用例?

当你学会了如何设计测试用例之后&#xff0c;接下来便是开始用例的编写。 在设计阶段&#xff0c;更准确的说应该是识别测试点的过程&#xff0c;而编写阶段则是将测试点细化成一条条测试用例的过程&#xff0c;有了比较全的用例场景后&#xff0c;如何让别人更舒服、更方便、…

输出自然数-第10届蓝桥杯国赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第7讲。 输出自然数&#x…

可移植性测试包括哪些

可移植性测试 可移植性是指应用程序能够安装到不同的环境中&#xff0c;在不同的环境中使用&#xff0c;甚至可以移动到不同的环境中。当然&#xff0c;前两者对所有系统都很重要。就PC软件而言&#xff0c;鉴于操作系统、共存和互操作应用程序、硬件、带宽可用性等方面的快速变…

Python标准库 subprocess 模块多进程编程详解

1. Subprocess模块介绍 1.1 基本功能 subprocess 模块&#xff0c;允许生成新的进程执行命令行指令&#xff0c;python程序&#xff0c;以及其它语言编写的应用程序, 如 java, c,rust 应用等。subprocess可连接多个进程的输入、输出、错误管道&#xff0c;并且获取它们的返回…

2024世亚国际软件博览会(世亚软博会)国内外知名软件厂商踊跃报名

作为亚洲软件展会的风向标&#xff0c;2024世亚国际软件博览会&#xff08;简称“世亚软博会”&#xff09;备受瞩目。近日&#xff0c;从组委会传来消息&#xff0c;目前招商工作已经接近半程&#xff0c;大批国内外软件厂商踊跃报名&#xff0c;展位销售异常火爆。 本届“世亚…

一台电脑使用多个gitee账号,以及提交忽略部分文件

目录 ​编辑 一&#xff1a;前言 二&#xff1a;解决方法 三&#xff1a;提交gitee时忽略文件 一&#xff1a;前言 在开发中&#xff0c;我们拥有不止一个 gitee 账号&#xff0c;通常而言一个是公司的&#xff0c;一个是私人的。有时候我们在公司写了一些自己的东西&#…

C++ set map 的模拟实现

set 的模拟实现 我们在很早之前就提到过&#xff0c;set 的底层数据结构是红黑树。红黑树的实现一般都是 key-value 的结构。但是我们在使用 set 的时候明明只传入了一个模板参数哇&#xff01;我们来看库中的实现&#xff1a; 我们可以看到&#xff0c;set 的模板参数 Key 就…

深入理解强化学习——多臂赌博机:乐观初始值

分类目录&#xff1a;《深入理解强化学习》总目录 目前为止我们讨论的所有方法都在一定程度上依赖于初始动作值 Q 1 ( a ) Q_1(a) Q1​(a)的选择。从统计学角度来说&#xff0c;这些方法&#xff08;由于初始估计值&#xff09;是有偏的。对于采样平均法来说&#xff0c;当所有…

Linux编译器——gcc/g++使用

前言&#xff1a; 在上一篇&#xff0c;我们学习了关于文本编辑器 vim 的全部知识&#xff0c;今天给大家带来的是关于Linux编译器—gcc/使用的详细介绍。 本文目录 &#xff08;一&#xff09;温习程序的产生的过程 1、前言 2、程序的产生过程 3、&#x1f31c;初步认识 gc…

中兴新支点国产系统将联合阿里龙蜥社区制定多项行业标准

近日&#xff0c;从中兴新支点操作系统官方了解到&#xff0c;中兴迎来阿里龙蜥社区理事长马涛一行人&#xff0c;并进行了深度交流。会上中兴新支点操作系统回顾了近一年在龙蜥社区的贡献和投入&#xff0c;并对双方未来的合作诉求和合作计划展开了讨论。会后&#xff0c;龙蜥…

代理IP的稳定性至关重要!真实技术案例引发深思

在当今的网络世界中&#xff0c;IP代理已经成为了我们保护个人隐私、开展各类互联网业务的重要工具。不过很多人在使用IP代理时&#xff0c;常常会忽视一个关键因素——代理IP的稳定性。今天我们就来谈谈这个问题&#xff0c;并分享一个真实的案例&#xff0c;希望能引起大家对…

linux粘滞位的介绍及使用

文章目录 1.粘滞位的引入2.粘滞位的使用 1.粘滞位的引入 首先看一个场景 已知 对目录无w权限时 无法进行目录中的文件的创建/删除操作但是普通用户通过sudo命令 以root身份创建一个文件 rw- r-- r-- 普通用户此时是other 没有w权限 但却可以删除 [root和普通用户在一个目录下时…

1210. 连号区间数(枚举)

题目&#xff1a; 1210. 连号区间数 - AcWing题库 思路&#xff1a;枚举 枚举一般是先暴力再优化。 注意&#xff1a;对于区间的枚举&#xff0c;一般是定一移一。固定任何一端移动另外一端均可以。但是此题为便于在枚举移动端的过程中确定最大最小&#xff0c;选择定左移右…

TinyMce富文本编辑器使用【详细】

TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。同类程序有&#xff1a;UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。 TinyMCE的优势&#xff1a; 开源可商用&#xff0c;基于LGPL2.1插件丰富&#xff0c;自带插件基本涵盖日常…