elform-item动态prop

news2024/11/24 19:42:09

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

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

页面中显示的东西,完全是自定义组合的而不是固定的,所以此时的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.coloradmin.cn/o/1183066.html

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

相关文章

在 “219.**** 找不到用于监控项 key“agent.hostname“ 的主机接口.

细节 无法添加主机 在 "219.151" 找不到用于监控项 key"agent.hostname" 的主机接口.z 这个时候要改一下 方式&#xff1a;

区块链导论:数字经济需要培养多学科交叉综合人才

日前&#xff0c;在第三届“一带一路”国际合作高峰论坛数字经济高级别论坛上&#xff0c;香港科技大学校长叶玉如提出了一个引人深思的观点&#xff1a;“数字经济是多个学科领域交叉融合&#xff0c;我们需要的人才既要懂得经济学&#xff0c;也要理解人工智能、大数据、区块…

STM32Cube +VSCode开发环境搭建

STM32Cube VSCode开发环境搭建 0.前言一、各种方式对比1.STM32CubeMX CLion2.STM32CubeIDE VSCode STM32 VSCode Extension3.VSCode EIDE插件 二、STM32CubeIDE VSCode STM32 VSCode Extension环境搭建1.需要安装的软件2.相关配置3.编译测试 三、总结 0.前言 工欲善其事&…

视频批量剪辑技巧:AI智剪,智能技术让视频剪辑更简单

在视频制作过程中&#xff0c;剪辑是一项必不可少的任务。然而&#xff0c;对于许多非专业人士来说&#xff0c;视频剪辑却是一项令人望而生畏的任务。需要耗费大量的时间和精力&#xff0c;而且还需要一定的技术和经验。但是&#xff0c;随着人工智能技术的不断发展&#xff0…

yolov5的qat量化

前两篇文章讲解了yolov5的敏感层分析及ptq量化流程,本篇文章在前两篇文章的基础上,继续讲解yolov5的qat量化流程。 ptq和qat的区别如下所示: qat量化流程如下所示: 首先在数据集上以FP32精度进行模型训练,得到训练好的baseline模型;在baseline模型中插入伪量化节点,进行…

时序教程六部曲:Kaggle 时间序列实战项目

在https://kaggle.com/learn页面Kaggle官方提供了学习实战项目&#xff0c;最近更新了Time Series时间序列的知识点。 Time Series 课程包括如下章节&#xff1a; Linear Regression With Time Series Trend Seasonality Time Series as Features Hybrid Models Forecast…

C++命名空间知识点总结

引入 在 C 应用程序中。可能会写一个名为 xyz() 的函数&#xff0c;在另一个可用的库中也存在一个相同的函数 xyz()。这样&#xff0c;编译器就无法判断所使用的是哪一个 xyz() 函数。 因此&#xff0c;引入了命名空间这个概念&#xff0c;专门用于解决上面的问题&#xff0c…

LibreOJ - 2874 历史研究 (回滚莫队)

回滚莫队就是在基础莫队的前提下&#xff0c;用更多的增加操作代替了减操作。 分成两种情况 1、一个询问的整个区间都在一个块儿里&#xff1b;这种情况直接暴力求即可&#xff0c;因为在一个块儿里&#xff0c;时间复杂度不会高。 2、一个询问的整个区间不在一个块儿里&#…

【Shell脚本6】Shell 运算符

Shell 基本运算符 Shell 和其他编程语言一样&#xff0c;支持多种运算符&#xff0c;包括&#xff1a; 算术运算符关系运算符布尔运算符逻辑运算符字符串运算符文件测试运算符 原生bash不支持简单的数学运算&#xff0c;但是可以通过其他命令来实现&#xff0c;例如 awk 和 …

轻量封装WebGPU渲染系统示例<21>- 3D呈现元胞自动机之生命游戏(源码)

实现原理: 基本PBR光照与gpu compute计算 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/GameOfLifeSpherePBR.ts当前示例运行效果: 其他效果截图: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如…

使用Ruby编写通用爬虫程序

目录 一、引言 二、环境准备 三、爬虫程序设计 1. 抓取网页内容 2. 解析HTML内容 3. 提取特定信息 4. 数据存储 四、优化和扩展 五、结语 一、引言 网络爬虫是一种自动抓取互联网信息的程序。它们按照一定的规则和算法&#xff0c;遍历网页并提取所需的信息。使用Rub…

Leetcode刷题详解——子集

1. 题目链接&#xff1a;78. 子集 2. 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xf…

Mactracker for mac(硬件信息查询工具)免费下载

想知道你电脑的信息吗&#xff1f;Mactracker Mac版是Macos上一款硬件信息查询工具&#xff0c;可以查询电脑中的硬件信息&#xff0c;还可以查看您使用软件的具体情况&#xff0c;苹果电脑产品和周边产品的信息&#xff0c;售价等等&#xff0c;让您对电脑有更多深刻的了解。 …

【C++】开源:rapidjson数据解析库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍rapidjson数据解析库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&…

求职招聘小程序源码系统+社交招聘+多城市招聘 带完整搭建教程

大家好&#xff0c;今天罗峰来给大家分享一款求职招聘小程序源码系统。目前&#xff0c;求职招聘市场在不断变革。传统的招聘网站已经无法满足人们对于高效、便捷、多元化的招聘需求。该系统集求职招聘、社交招聘、多城市招聘等功能于一体&#xff0c;旨在为用户提供更加便捷、…

京东商品详情API,页面信息采集,优惠券信息获取

京东开放平台提供了API接口来访问京东商品详情。通过这个接口&#xff0c;您可以获取到商品的详细信息&#xff0c;如商品名称、价格、库存量、描述等。额外还附加一个优惠券信息接口。代码如下: 京东获得JD商品详情 API 优惠券接口 公共参数 名称类型必须描述keyString是调…

【I/O流之旅】File类-零基础入门指南

&#x1f38a;专栏【Java】 &#x1f33a;每日一句:看不清楚未来时,就比别人坚持久一点 ⭐欢迎并且感谢大家指出我的问题 目录 1.File概述 2.File构造方法 (1).根据文件路径创建文件对象 (2).根据父路径名字符串和子路径名字符串创建对象 (3).根据父路径对应文件对象和子路…

Python基础入门(3)----Python基础语法:解释器、标识符、关键字、缩进

文章目录 Python解释器标识符关键字缩进代码示例与运行结果Python是一种高级编程语言,以其简洁明了的语法和强大的功能而受到广泛欢迎。本文将介绍Python的一些基础语法元素,包括解释器、标识符、关键字和缩进,并提供相应的代码示例和运行结果。 Python解释器 Python是一种…

登陆认证权限控制(2)—— 基于Spring security 安全框架的权限管理 注解式权限控制 RABC模型

前言 登陆认证&#xff0c;权限控制是一个系统必不可少的部分&#xff0c;一个开放访问的系统能否在上线后稳定持续运行其实很大程度上取决于登陆认证和权限控制措施是否到位&#xff0c;不然可能系统刚刚上线就会夭折。 Spring Security 是一个能够为基于 Spring 的企业应用…

vue2 集成 - 超图 - SuperMap iClient3D for WebGL 及常用方法

1:下载SuperMap iClient3D for WebGL SuperMap iClient3D for WebGL产品包 打开资源目录如下 2:格式化项目中所用的依赖包 开发指南 从超图官网下载SuperMap iClient3D 11i (2023) SP1 for WebGL_CN.zip解压后,将Build目录下的SuperMap3D复制到项目中 \public\static…