当前位置: 首页 > news >正文

【form校验】3.0项目多层list嵌套

请添加图片描述


const { required, phoneOrMobile } = CjmForm.rules;
export default function detail() {const { query } = getRouterInfo(location);const formRef = useRef(null);const [crumbList, setCrumbList] = useState([{url: "/wenling/Reviewer",name: "审核人员",},{name: query.type == "look" ? "查看" : "编辑",},]);const [form, setForm] = useState({auditNodeConfig: [{nextAuditNode: "农办审批",userList: [{batchAudit: false,phone: "",},],},{nextAuditNode: "农水局审批",userList: [{batchAudit: false,phone: "",},],},{nextAuditNode: "同步财政局审核结果",userList: [{batchAudit: false,phone: "",},],},],});const [loading, setLoading] = useState(false);const [spinning, setSpinning] = useState(false);useEffect(() => {getConfigInfo();}, []);async function getConfigInfo() {setSpinning(true);const res = await configLook({ confId: query.confId });if (res.results && res.state && res.state == 200) {setForm(transformData(res.results));} else {if (query.processCode == "10001002") {setForm({auditNodeConfig: [{nextAuditNode: "农办审批",userList: [{batchAudit: false,phone: "",},],},],});}}setSpinning(false);}const rules = useMemo(() => {let newRule = {};form["auditNodeConfig"].forEach((item, key) => {item["userList"].forEach((record, recordKey) => {newRule[`auditNodeConfig.${key}.userList.${recordKey}.phone`] = [required,phoneOrMobile,];newRule[`auditNodeConfig.${key}.userList.${recordKey}.userId`] = [required,];});});return newRule;}, [form]);const modalForm = useMemo(() => {let newForm = {};form["auditNodeConfig"].forEach((item, key) => {item["userList"].forEach((record, recordKey) => {newForm[`auditNodeConfig.${key}.userList.${recordKey}.phone`] =record["phone"];newForm[`auditNodeConfig.${key}.userList.${recordKey}.userId`] =record["userId"];});});return newForm;}, [form]);const getValue = (eventOrvalue) => {const type = typeof eventOrvalue;if (type === "object" &&eventOrvalue !== null &&eventOrvalue.target &&eventOrvalue.target.value) {return eventOrvalue.target.value;}return eventOrvalue;};const setFormData = (fieldName, index, recordKey) => {return (eventOrvalue) => {let value = getValue(eventOrvalue);if (fieldName == "batchAudit") {value = eventOrvalue.target.checked;}form["auditNodeConfig"][index]["userList"][recordKey][fieldName] = value;setForm(Object.assign({}, form));};};const addHandle = (index) => {const listLen = get(form, `auditNodeConfig[${index}].userList`, []).length;if (listLen >= 4) {Message.warning("最多添加4个审批人员!");} else {form["auditNodeConfig"][index]["userList"].push({batchAudit: false,phone: "",});setForm(Object.assign({}, form));}};const saveHandle = async () => {setLoading(true);const valid = await formRef.current.validate();if (valid) {let data = { ...form };data["confId"] = query.confId;data["processCode"] = query.processCode;const res = await configEdit(transformTree(data));if (res.state && res.state == 200) {Message.success("操作成功");historyBack();} else {Message.error("操作失败,请重试!");}}setLoading(false);};const delHandle = (index, recordKey) => {form["auditNodeConfig"][index]["userList"].splice(recordKey, 1);setForm(Object.assign({}, form));};return (<div className={styles.reviewerBox}><Spin spinning={spinning}><CrumbBar list={crumbList} /><CjmFormlabelWidth="180px"ref={formRef}model={modalForm}rules={rules}><CjmForm.Item label="审批类型:"><CjmInputvalue={query.processName}disabled={true}style={{ width: "380px" }}/></CjmForm.Item>{form &&form.auditNodeConfig.map((item, index) => {return (<div className={styles.auditItem} key={index}><h2 style={{ marginLeft: "24px" }}>{item["nextAuditNode"]}</h2>{item["userList"] &&item["userList"].map((record, recordKey) => {return (<div key={recordKey} className={styles.formItem}><CjmForm.Itemlabel="审批人名称:"prop={`auditNodeConfig.${index}.userList.${recordKey}.userId`}><RemoteSelectstyle={{ width: "380px" }}disabled={query.type == "look" ? true : false}labelKey="userName"valueKey="userId"value={record.userId}label={record.userName}remoteUrl={`${api.reviewer.departmentId}?departmentId=${query.optDeptId}&disableFlag=1`}onChange={{userName: setFormData("userName",index,recordKey),userId: setFormData("userId", index, recordKey),departmentId: setFormData("deptId",index,recordKey),mobileId: setFormData("phone",index,recordKey),}}/></CjmForm.Item><CjmForm.Itemlabel="审批人手机号:"prop={`auditNodeConfig.${index}.userList.${recordKey}.phone`}><CjmInputdisabled={query.type == "look" ? true : false}style={{ width: "380px" }}value={record.phone}onChange={setFormData("phone", index, recordKey)}/></CjmForm.Item><CjmForm.Item label="审批操作:" prop="batchAudit"><Checkboxdisabled={query.type == "look" ? true : false}checked={record.batchAudit}onChange={setFormData("batchAudit",index,recordKey)}>批量通过</Checkbox><span style={{ marginLeft: "24px" }}>默认单个审核,设置批量审核后允许该节点可批量审核</span></CjmForm.Item><Divider className={styles.line} />{recordKey != 0 && (<imgclassName={styles.close}src={deleteImg}onClick={() => delHandle(index, recordKey)}/>)}</div>);})}{query.type !== "look" && index == 0 && (<Buttontype="primary"style={{ marginLeft: "224px" }}onClick={() => addHandle(index)}>+新增(最多添加4个审批人员)</Button>)}</div>);})}</CjmForm><Button className={styles.btnLeave} onClick={() => historyBack()}>返回</Button>{query.type !== "look" && (<Buttontype="primary"className={styles.btnSave}loading={loading}onClick={saveHandle}>保存</Button>)}</Spin></div>);
}

相关文章:

【form校验】3.0项目多层list嵌套

const { required, phoneOrMobile } CjmForm.rules; export default function detail() {const { query } getRouterInfo(location);const formRef useRef(null);const [crumbList, setCrumbList] useState([{url: "/wenling/Reviewer",name: "审核人员&quo…...

公共功能测试用例

1、UI测试 布局是否合理&#xff0c;输入框、按钮是否对齐 行列间距是否保持一致弹出窗口垂直居中对其界面的设计风格是否与UI的设计风格一致 系统是否使用统一风格的控件界面的文字是否简洁易懂&#xff0c;是否有错别字 兼容性测试&#xff1a;不同浏览器、版本、分辨率下&a…...

【电路笔记】-并联RLC电路分析

并联RLC电路分析 文章目录 并联RLC电路分析1、概述2、AC的行为3、替代配置3.1 带阻滤波器3.2 带通滤波器 4、总结 电子器件三个基本元件的串联行为已在我们之前的文章系列 RLC 电路分析中详细介绍。 在本文中&#xff0c;介绍了另一种称为并联 RLC 电路的关联。 在第一部分中&a…...

ros1 client

Client&#xff08;客户端&#xff09;&#xff1a;发布海龟生成请求 [类似Publisher] Serve&#xff08;服务端&#xff09;&#xff1a;海龟仿真器,接收请求 [类似于Subscriber] Service&#xff08;服务&#xff09;&#xff1a;生成海龟的具体内容&#xff0c;其中服务类型…...

射频功率放大器应用中GaN HEMT的表面电势模型

标题&#xff1a;A surface-potential based model for GaN HEMTs in RF power amplifier applications 来源&#xff1a;IEEE IEDM 2010 本文中的任何第一人称都为论文的直译 摘要&#xff1a;我们提出了第一个基于表面电位的射频GaN HEMTs紧凑模型&#xff0c;并将我们的工…...

CSP(Common Spatial Patterns)——EEG特征提取方法详解

基于CSP的运动想象 EEG 特征提取和可视化参考前文&#xff1a;https://blog.csdn.net/qq_43811536/article/details/134273470?spm1001.2014.3001.5501 目录 1. CSP是什么&#xff1f;1.1 CSP的含义1.2 CSP算法1.3 CSP特征的特点 2. CSP特征在EEG信号分类任务中的应用2.1 任务…...

【Git】Git 学习笔记_操作本地仓库

1. 安装与初始化配置 1.1 安装 下载地址 在文件夹里右键点击 git bash here 即可打开命令行面板。 git -v // 查看版本1.2 配置 git config --global user.name "heo" git config --global user.email xxxgmail.com git config --global credential.helper stor…...

杂记(3):在Pytorch中如何操作将数据集分为训练集和测试集?

在Pytorch中如何操作将数据集分为训练集和测试集&#xff1f; 0. 前言1. 手动切分2. train_test_split方法3. Pytorch自带方法4. 总结 0. 前言 数据集需要分为训练集和测试集&#xff01; 其中&#xff0c;训练集单纯用来训练&#xff0c;优化模型参数&#xff1b;测试集单纯用…...

【MySQL篇】数据库角色

前言 数据库角色是被命名的一组与数据库操作相关的权限&#xff0c;角色是权限的集合。因此&#xff0c;可以为一组具有相同权限的用户创建一个角色&#xff0c;使用角色来管理数据库权限可以简化授权的过程。 CREATE ROLE&#xff1a;创建一个角色 GRANT&#xff1a;给角色授…...

c++ 信奥赛编程 2050:【例5.20】字串包含

#include<iostream> #include<cstring> using namespace std; int main() {string str1,str2;int temp;cin>>str1>>str2;//判断长度 if(str1.size()<str2.size()){ swap(str1,str2); //交换内容 }str1str1str1; //AABCDAABCDAABCDAABCDif(str…...

用dbeaver创建一个enum类型,并讲述一部分,mysql的enum类型的知识

写这个博客的目的就是我在网上看了半天&#xff0c;发现没有这方面的知识&#xff0c;也许是老手认为这个太简单了&#xff0c;不过我还是告诉新人使用dbeaver来创建一个enum类型的方法&#xff1a; 就是enum("a","b","name") 第一步用dbeaver…...

Paste v4.1.2(Mac剪切板)

Paste for Mac是一款运行在Mac OS平台上的剪切板小工具&#xff0c;拥有华丽的界面效果&#xff0c;剪切板每一条记录可显示&#xff08;预览&#xff09;文本&#xff0c;图片等记录的完整内容&#xff0c;可以记录最近指定条数的剪切板信息&#xff0c;方便用户随时调用&…...

事件绑定-回调函数

1.事件的概念 2.小程序常用的事件集 2.1 bindtap 点击回调事件方法 2.1.1语法格式 2.1.2 事件处理中调用data 使用setDatacount&#xff1a;这种方式 直接使用this.data.count 2.1.3 事件处理中传参 错误示范&#xff1a; 传递方式&#xff1a;数值用{{}}&#xff0c;直接引…...

Makefile 总述

目录 一、Makefile 里有什么&#xff1f; 1、显式规则 2、隐晦规则 3、变量的定义 4、文件指示 5、注释 二、Makefile 的文件名 三、引用其它的 Makefile 四、环境变量 MAKEFILES 五、make 的工作方式 一、Makefile 里有什么&#xff1f; Makefile 里主要包含了五个东…...

写给新用户-Mac软件指南篇:让你的Mac更好用

用了macOS也有小四年了&#xff0c;今天打算分享一下Mac上的常用软件&#xff0c;说不上精通&#xff0c;但也算是有一些心得体会。平时也会定期对软件做整理&#xff0c;所以有了这篇文章。如果能帮到刚刚接触macOS或正在寻觅软件的你&#xff0c;那当然再好不过了。 软件推荐…...

03运算符综合

03 3.1.1算数运算符 3.1.2赋值运算符 3.1.3比较&#xff08;关系&#xff09;运算符 3.1.4逻辑运算符 3.1.5位运算符 3.2运算符的优先级 3.3条件表达式...

LeetCode刷题--思路总结记录

23-11-08每日一题&#xff1a;2609.最长平衡子字符串 链接&#xff1a;2609.最长平衡子字符串 总体思路&#xff1a; 平衡字符串要求“字符串前半段的0和后半段的1个数相同” > 分别记录0和1的计数结果&#xff0c;并最终取二者的最小值2字符串必须0开头&#xff0c;1结束 …...

Nodejs

node是运行js的环境 node 基础命令 // 初始化 // npm init // npm init -y// 全部选择yes // 安装包 // npm install 包名 // npm i// 安装package-lock.json里面所有的包到node_modules // npm i 包名// 安装当前最新版&#xff0c; // npm i 包名版本号//指定版本安装 // n…...

【面经】spring,springboot,springcloud有什么区别和联系

Spring、SpringBoot、SpringCloud都是Java开发中的重要框架&#xff0c;它们的作用和区别如下&#xff1a; Spring&#xff1a;是一个轻量级的开源框架&#xff0c;是为解决企业应用开发的复杂性而创建的。它提供了AOP&#xff08;面向切面编程&#xff09;和Ioc&#xff08;控…...

SpringBoot Kafka消费者 多kafka配置

一、配置文件 xxxxxx:kafka:bootstrap-servers: xx.xx.xx.xx:9092,xx.xx.xx.xx:9092consumer:poll-timeout: 3000key-deserializer: org.apache.kafka.common.serialization.StringDeserializervalue-deserializer: org.apache.kafka.common.serialization.StringDeserializer…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...