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

格子表单/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)breakcase 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}条]`)}}breakdefault:_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.hqwc.cn/news/538889.html

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

相关文章

【Flutter 面试题】Flutter如何处理响应式布局?

【Flutter 面试题】Flutter如何处理响应式布局&#xff1f; 文章目录 写在前面口述回答补充说明完整代码示例运行结果详细说明 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云社区专家博主&am…

推荐葫芦AI-目前国内AI最好整合的平台

一、前言 主流的 AI 模型&#xff0c;目前都是收费制。如果同时使用多个模型&#xff0c;每月是一笔不小的费用&#xff0c;而且过程很麻烦。 GPT-4&#xff1a;20美元/月文心一言&#xff1a;49.9元人民币/月Midjourney&#xff1a;10美元/月DALL-E&#xff1a;每张图片0.02美…

Spring Boot项目怎么从Nacos注册中心上获取其他服务列表信息?

一、前言 在spring boot项目开发过程中&#xff0c;为了进行微服务之间的调用&#xff0c;我们一般会使用注册中心&#xff0c;比如Nacos。假设我们有一个业务需求&#xff0c;应用A需要从Nacos注册中心上获取服务信息进行分析&#xff0c;需要怎么实现呢&#xff1f; 二、开…

Jsp在Javaweb中扮演什么角色?

1.什么是Jsp JSP&#xff08;Java Server Pages&#xff0c;Java 服务器页面&#xff09;是一种动态网页技术&#xff0c;它允许在 HTML 页面中嵌入 Java 代码&#xff0c;并由 Web 服务器在请求页面时动态生成 HTML 页面。JSP 通常用于创建动态 Web 内容&#xff0c;如交互式表…

2024.3.11 训练记录(14)

继续补题 文章目录 ICPC 2018青岛I Soldier GameICPC 2018青岛K Airdrop ICPC 2018青岛I Soldier Game 题目链接 线段树 果然稍微复杂一点的线段树就很难实现啊&#xff0c;不看题解根本没反应过来是线段树 struct Node {int l, r, lb, rb, nb, b; } tr[N * 4];其中&#x…

事物的传播属性

事务传播属性是Spring框架在处理事务时的一个重要概念&#xff0c;它定义了在事务方法被另一个事务方法调用时&#xff0c;如何处理事务边界的行为。这些属性是通过Spring的Transactional注解中的propagation属性来设置的。下面是几个常见的Spring事务传播属性&#xff1a; *RE…

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

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

C++特殊类设计【特殊类 || 单例对象 || 饿汉模式 || 懒汉模式】

目录 一&#xff0c;特殊类设计 1. 只在堆上创建的类 2. 只允许在栈上创建的类 3. 不能被继承的类 4. 不能被拷贝的类 5. 设计一个类&#xff0c;只能创建一个对象&#xff08;单例对象&#xff09; 饿汉模式 懒汉模式 C11静态成员初始化多线程安全问题 二&#xff…

实现微服务:匹配系统

HTTP与WebSocket协议 1. HTTP协议是无状态的&#xff0c;每次请求都是独立的&#xff0c;服务器不会保存客户端的状态信息。而WebSocket协议是有状态的&#xff0c;一旦建立连接后&#xff0c;服务器和客户端可以进行双向通信&#xff0c;并且可以保持连接状态&#xff0c;服务…

谈谈你对Java平台的理解?

从你接触 Java 开发到现在&#xff0c;你对 Java 最直观的印象是什么呢&#xff1f;是它宣传的 “Write once, run anywhere”&#xff0c;还是目前看已经有些过于形式主义的语法呢&#xff1f;你对于 Java 平台到底了解到什么程度&#xff1f;请你先停下来总结思考一下。 今天…

【Qt】常用控件或属性(1)

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、QWidget属性一览 二、控件button、属性enabled(可用状态) 三、属性geometry(修改位置和尺寸) 1、QRect类型的结…

mac系统下GCC优化编译的使用

mac系统下GCC优化编译的使用 编译流程 预处理&#xff1a;g -E homework.cpp -o homework.i 编译&#xff1a;g -S homework.i -o homework.s //.s为汇编文件 汇编&#xff1a;g -c homework.s -o homework.o 链接&#xff1a;g homework.o -o homework 优化选项 -O0&#…