格子表单GRID-FORM | 必填项检验 BUG 修复实录

news2024/11/17 17:54:31

格子表单/GRID-FORM已在Github 开源,如能帮到您麻烦给个星🤝

GRID-FORM 系列文章

  • 基于 VUE3 可视化低代码表单设计器
  • 嵌套表单与自定义脚本交互
  • 文档网站搭建(VitePress)与部署(Github Pages)
  • 必填项检验 BUG 修复实录

#1 缘起

格子表单支持设置字段为必填项,组件会在数据提交前自检,发现有必填字段留空,则抛出异常。

增加子(嵌套)表单功能后,上述校验出现 BUG 🐛,感谢热心网友的 ISSUE 提醒。

#1.1 原因分析

原校验流程:

  1. 表单初始化时,构建必填项集合 formRequired : Map<String, Object>(以字段编号作为 KEY,元素包括:label/字段中文,msg/提示信息,regex/正则表达式)
  2. 校验时,遍历 formRequired ,匹配格则
  3. 若有字段(1个或多个)检查未通过,抛出异常

代码如下:

const _checkRequire = formObj=>{
    let fails = []
    Object.keys(formRequired).forEach(key=>{
        let { regex, msg, label } = formRequired[key]
        if(!formObj[key])   fails.push(`${label}${key})未填写`)
        else{
            if(!!regex && !RegExp(regex).test(formObj[key])) {
                fails.push(msg||`${label}${key})校验未通过`)
            }
        }
    })

    if(fails.length){
        props.debug && track(`[表单检查]`, fails)
        return emits("failed", fails)
    }
}

子表单下,字段编号可能重复,嵌套对象下遍历时不能正常匹配。如上图表单的校验过程 :

// 构建的规则
const formRequired = {
	school: { label:"学校名称", regex: "", msg:"" }
}

// 用户填写表单
const formData = {
	name: "fdgs",
	origin: "21,
	age: 123,
	educates: [
		{ type:"小学", from:"2024-02-18", school:"e121321" }
	]
}

// 检验时,遍历 formRequired,提取出 school,发现在 formData 中没有 formData['school'],于是报错

#2 思路

首先想到的解决方案,就是支持嵌套对象的检查:递归对当前层级的数据对象进行检查,直至没有下层嵌套。

/**
 * 检测必填项
 * 子表单(非 SIMPLE)必填无法正常检测
 *      https://github.com/0604hx/grid-form/issues/3
 *
 * @param {Array<import('.').FormItem>} items - 表单定义项
 * @param {Object} bean - 与 items 对应的数据对象
 * @param {Array<String>} fails - 错误清单
 * @param {String} prefix - 前缀文本
 */
const _checkRequire = (items, bean, fails, prefix="")=>{
    for(const item of items){
        if(item._container === true){
            switch(item.category){
                case SINGLE:
                    _checkRequire(item.items, bean[item._uuid]||{}, fails)
                    break
                case MULTIPLE:
                    const rows = bean[item._uuid]
                    if(Array.isArray(rows)){
                        for (let i = 0; i < rows.length; i++) {
                            const row = rows[i]
                            _checkRequire(item.items, row, fails, `[${item._text||item.title}的第${i+1}条]`)
                        }
                    }
                    break
                default:
                    _checkRequire(item.items, bean, fails)
            }
        }
        else if(item._required == true){
            //检查必填表单项是否符合预期
            if(!bean[item._uuid])
                fails.push(`${prefix}${item._text}${item._uuid})未填写`)
            else{
                if(!!item._regex && !RegExp(item._regex).text(bean[item._uuid]))
                    fails.push(prefix+(item._message || `${item._text}${item._uuid})校验未通过:${item._regex}`))
            }
        }
    }
}

新思路删除了中间变量 formRequired,仅在提交前遍历全部表单项进行校验,能够精准到子表单的某一行,理论上支持无限嵌套😎。

#3 尾声

修复后,效果如下:

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

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

相关文章

打卡学习kubernetes——了解五种控制器类型

目录 1 Deployment控制器 2 StatefulSet控制器 3 DaemonSet控制器 4 Job控制器 5 CronJob控制器 1 Deployment控制器 Deployment为Pod和Replica Set&#xff08;下一代Replication Controller&#xff09;提供声明式更新。 Deployment运行无状态应用&#xff0c;一般情况…

redis中的zset的原理

一、zset有序集合的原理 如果有序集合元素个数少于128个且元素值小于64字节&#xff0c;使用压缩列表&#xff08;新版本已经废弃压缩列表改用listpack数据结构了&#xff09; 如果不满足上述条件&#xff0c;采用跳表作为redis的底层数据结构 二、压缩列表 1.由连续内存块组…

迄今为止易用 —— 的 “盲水印“ 实现方案

前期回顾 网站的打赏 —— 新一代的思路-CSDN博客https://blog.csdn.net/m0_57904695/article/details/136704914?spm1001.2014.3001.5501 目录 CSDN 彩色之外 &#x1f4dd; 前言&#xff1a; &#x1f6e0;️ vue3-blind-watermark &#x1f916; 安装 ♻️ 引入&am…

【LeetCode热题100】142. 环形链表 II(链表)

一.题目要求 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统…

GEE必须会教程—影像集合的操作方法

影像集合&#xff08;Image Collection&#xff09;&#xff0c;说白了就是把一堆影像打包在一起形成的集合&#xff0c;我们可以用用前文讲过的矢量集合的方法来理解&#xff08;http://t.csdnimg.cn/bRJOT&#xff09;&#xff0c;学习影像集合的过程中&#xff0c;同样需要掌…

【DL经典回顾】激活函数大汇总(八)(Maxout Softmin附代码和详细公式)

激活函数大汇总&#xff08;八&#xff09;&#xff08;Maxout & Softmin附代码和详细公式&#xff09; 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里&#xff0c;激活函数扮演着不…

strcat的模拟实现

一&#xff1a;strcat函数的定义&#xff1a; strcat函数功能的解释&#xff1a; 将源字符串追加&#xff08;连接&#xff09;到目的字符串的后面 strcat函数要点&#xff1a; 源字符串必须以 \0 结束。 目标空间必须有足够的大&#xff0c;能容纳下源字符串的内容。 目…

使用STM32+ESP8266(ESP-01S)+点灯科技(手机端Blinker)实现远程控制智能家居

硬件准备&#xff1a;STM32单片机、ESP8266&#xff08;ESP-01S&#xff09;、CH340C下载烧录器 软件准备&#xff1a;STM32CubeMX、Keil uVision5、Arduino IDE、 点灯科技&#xff08;手机端APP Blinker&#xff09;点灯科技 (diandeng.tech)点击进入 值得注意的是&#x…

NO9 蓝桥杯单片机之串口通信的使用

1 基本概念 简单来说&#xff0c;串口通信是一种按位&#xff08;bit&#xff09;传输数据的通信方式。 其他一些知识就直接贴图吧&#xff08;单工&#xff0c;半双工这些学过通信的同学应该都知道&#xff0c;可以上网查询一下具体概念。&#xff09; 来源还是&#xff1a;…

【CSP试题回顾】201709-3-JSON查询

CSP-201709-3-JSON查询 解题思路 1. 初始化数据结构 map<string, string> strContent: 存储字符串类型属性的内容。键是属性名&#xff08;可能包含通过点.连接的多级属性名&#xff09;&#xff0c;值是属性的字符串值。vector<string> keyVec: 存储当前正在处…

酒店客房管理系统设计与实现(论文+源码)_kaic

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本酒店客房管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

SpringBoot+vue3打造企业级一体化SaaS系统

SpringBootvue3打造企业级一体化SaaS系统 简介&#xff1a;    全面提升前后端技术水平&#xff0c;独立完成全栈项目开发能力&#xff0c;快速进击全栈工程师&#xff0c;最终在面试中脱颖而出。整合后端主流技术&#xff08;Spring Boot、物理数据库隔离、加载动态权限、多…

网络基础 - 预备知识(协议、网络协议、网络传输流程、地址管理)

文章目录 1. 认识 协议2. 了解 网络协议2.1 引入 协议分层2.2 OSI 七层模型 与 TCP/IP 四层模型 3. 网络传输 流程&#xff01;&#xff01;&#xff01;3.1 网络传输流程图3.2 关于报头3.3 实例解释 传输过程&#xff08;封装与解包&#xff09; 4. 网络中的地址管理4.1 认识 …

力扣串题:字符串中的第二大数字

此题的精妙之处在于char类型到int类型的转化&#xff0c;需要运算来解决 int secondHighest(char * s) {int max1-1;int max2-1;int szstrlen(s);int i 0 ;for(i0;i<sz;i){if(s[i]>0&&s[i]<9){if((s[i]-0)>max1){max2max1;max1s[i]-0;}else if((s[i]-0)&l…

Linux I2C调试分享

I2C简介 I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种多主机、两线制、串行计算机总线&#xff0c;用于连接低速外围设备到处理器或微控制器。这种通信协议由Philips Semiconductor&#xff08;现在的NXP Semiconductors&#xff09;在1980年代初期开发。 I2C…

英语四六级有线调频听力广播-厦门华厦学院有线调频听力广播系统建设深度解析

英语四六级有线调频听力广播-厦门华厦学院有线调频听力广播系统建设深度解析 由北京海特伟业任洪卓发布于2024年3月14日 随着社会的快速发展和国际交流的日益频繁&#xff0c;英语已成为我们日常生活中不可或缺的一部分。作为衡量大学生英语水平的重要标准之一&#xff0c;大学…

javaweb数据传参类型(2)

前言 友友们好呀&#xff0c;今天来分享一下对于各种数据类型传参的问题&#xff0c;今天陪伴我们的云海 目录 前言 数组集合传参 补充 日期参数 补充 Json格式数据传参 补充 路径参数 补充 今日分享 ​​​​​​​数组集合传参 类似于我们之前进行的简单的参数传递…

深度学习模型部署(五)onnx模型以及相应工具

ONNX概念 onnx不仅仅一种模型参数存储的格式&#xff0c;还是一套完整的用于描述计算函数的编程语言&#xff0c;它的作用就是定义计算图&#xff0c;他本身无法进行。 这个概念和Verilog有点像&#xff0c;一个是硬件描述语言&#xff0c;一个是模型描述语言。 onnx模型或者说…

Learn OpenGL 10 Assimp+网格+模型

Assimp 一个非常流行的模型导入库是Assimp&#xff0c;它是Open Asset Import Library&#xff08;开放的资产导入库&#xff09;的缩写。Assimp能够导入很多种不同的模型文件格式&#xff08;并也能够导出部分的格式&#xff09;&#xff0c;它会将所有的模型数据加载至Assim…

git基础命令(一)

目录 基础概念git statusgit addgit diffgit loggit commit文件可以处于以下三种状态之一远程存储库与本地存储库参考 用于知识记录。后续有新的的内容&#xff0c;例子&#xff0c;将持续更新本文档。 基础概念 工作树&#xff1a;git add 之前&#xff0c;变动内容的文件列表…