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

【电路笔记】-并联RLC电路分析
并联RLC电路分析 文章目录 并联RLC电路分析1、概述2、AC的行为3、替代配置3.1 带阻滤波器3.2 带通滤波器 4、总结 电子器件三个基本元件的串联行为已在我们之前的文章系列 RLC 电路分析中详细介绍。 在本文中,介绍了另一种称为并联 RLC 电路的关联。 在第一部分中&a…...
ros1 client
Client(客户端):发布海龟生成请求 [类似Publisher] Serve(服务端):海龟仿真器,接收请求 [类似于Subscriber] Service(服务):生成海龟的具体内容,其中服务类型…...

射频功率放大器应用中GaN HEMT的表面电势模型
标题:A surface-potential based model for GaN HEMTs in RF power amplifier applications 来源:IEEE IEDM 2010 本文中的任何第一人称都为论文的直译 摘要:我们提出了第一个基于表面电位的射频GaN HEMTs紧凑模型,并将我们的工…...
CSP(Common Spatial Patterns)——EEG特征提取方法详解
基于CSP的运动想象 EEG 特征提取和可视化参考前文:https://blog.csdn.net/qq_43811536/article/details/134273470?spm1001.2014.3001.5501 目录 1. CSP是什么?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中如何操作将数据集分为训练集和测试集? 0. 前言1. 手动切分2. train_test_split方法3. Pytorch自带方法4. 总结 0. 前言 数据集需要分为训练集和测试集! 其中,训练集单纯用来训练,优化模型参数;测试集单纯用…...

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

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

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

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

Makefile 总述
目录 一、Makefile 里有什么? 1、显式规则 2、隐晦规则 3、变量的定义 4、文件指示 5、注释 二、Makefile 的文件名 三、引用其它的 Makefile 四、环境变量 MAKEFILES 五、make 的工作方式 一、Makefile 里有什么? Makefile 里主要包含了五个东…...
写给新用户-Mac软件指南篇:让你的Mac更好用
用了macOS也有小四年了,今天打算分享一下Mac上的常用软件,说不上精通,但也算是有一些心得体会。平时也会定期对软件做整理,所以有了这篇文章。如果能帮到刚刚接触macOS或正在寻觅软件的你,那当然再好不过了。 软件推荐…...

03运算符综合
03 3.1.1算数运算符 3.1.2赋值运算符 3.1.3比较(关系)运算符 3.1.4逻辑运算符 3.1.5位运算符 3.2运算符的优先级 3.3条件表达式...
LeetCode刷题--思路总结记录
23-11-08每日一题:2609.最长平衡子字符串 链接:2609.最长平衡子字符串 总体思路: 平衡字符串要求“字符串前半段的0和后半段的1个数相同” > 分别记录0和1的计数结果,并最终取二者的最小值2字符串必须0开头,1结束 …...
Nodejs
node是运行js的环境 node 基础命令 // 初始化 // npm init // npm init -y// 全部选择yes // 安装包 // npm install 包名 // npm i// 安装package-lock.json里面所有的包到node_modules // npm i 包名// 安装当前最新版, // npm i 包名版本号//指定版本安装 // n…...
【面经】spring,springboot,springcloud有什么区别和联系
Spring、SpringBoot、SpringCloud都是Java开发中的重要框架,它们的作用和区别如下: Spring:是一个轻量级的开源框架,是为解决企业应用开发的复杂性而创建的。它提供了AOP(面向切面编程)和Ioc(控…...
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…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...