antd嵌套表单验证

news2024/9/29 7:49:24

好久之前写的,但是突然想起来没写到这里,还是写一下吧~, 也没啥技术含量,就是有需要的同学要是能一下子看到就方便了~
嵌套表单项精髓就是在shouldUpdate属性
在这里插入图片描述

注意这句,当 shouldUpdate 为 true 时,Form 的任意变化都会使该 Form.Item 重新渲染

要注意 Form.Item 里包裹的子组件必须由函数返回

我们的示例是当前可选【限制时间】与【不限制时间】,然后【限制时间】的话要把时间填上,切换这个时间的时候,我们所填的限制时间要清空

我们在外层的Form.Item上加上shouldUpdatae属性,如果此项依赖于表单其他getFieldValue方法取出此属性值,再return返回表单项

<Form.Item shouldUpdate className={styles.timesDay}>
{({ getFieldValue }) => {
const timeLimitVal = getFieldValue(‘timeLimit’);
return (
<Form.Item></Form.Item>
)
} <Form.Item>

那我们可以使用那每次【是否限制时间】选项切换的时候,嵌套表单项都可以进行重新渲染,自动清空、是否禁用 等操作,提交表单的时候也会都验证上。

   <Form.Item shouldUpdate className={styles.timesDay}>
                {({ getFieldValue }) => {
                  const timeLimitVal = getFieldValue('timeLimit'); // 【是否限制时间】选项取值
                  return (
                    <DTIFormItem
                      bordered={true}
                      label="限制时段:天"
                      name="periodDate"
                      rules={[
                        // 自定义验证
                        {
                          required: timeLimitVal === 1,
                        },
                        () => ({
                          validator(_, value) {
                            if (timeLimitVal === 0) {
                              return Promise.resolve();
                            }
                            if (!value) {
                              return Promise.reject(new Error('请选择限制时间段')); // 返回promise表单验证报错项
                            }
                            if (
                              value === 1 ||
                              value === 2 ||
                              (value === 3 && selectTime.length !== 0)
                            ) {
                              return Promise.resolve();
                            }
                            if (value === 3 && selectTime.length === 0) {
                              return Promise.reject(new Error('请选择限制时间段'));
                            }
                          },
                        }),
                      ]}
                    >
                      <Radio.Group
                        onChange={(e) => {
                          let val = e.target.value;
                          if (val === 1 || val === 2) {
                            setSelectTime([]);
                          }
                        }}
                        disabled={!timeLimitVal} // 表单项是否禁用
                      >
                        <Space direction="vertical">
                          <Radio value={1}>每天</Radio>
                          <Radio value={2}>法定工作日</Radio>
                          <Radio value={3}>
                            <Form.Item shouldUpdate>
                              {({ getFieldValue }) => {
                                const periodDate = getFieldValue('periodDate'); // 嵌套表单项,选择【自选日期】
                                return (
                                  <DTIFormItem
                                    bordered={false}
                                    name="selectTime"
                                    className={styles.timeWrapper}
                                  >
                                    <div className={styles.timeTip}>自选日期(全选将等同于每天)</div>
                                    <Checkbox.Group
                                      value={selectTime}
                                      defaultValue={selectTime}
                                      options={TimeRanges}
                                      disabled={!timeLimitVal || periodDate !== 3} // 【自选日期】为某项时不可用 
                                      onChange={(val) => {
                                        setSelectTime(val);
                                        sourceForm.validateFields(['periodDate']);
                                      }}
                                    />
                                  </DTIFormItem>
                                );
                              }}
                            </Form.Item>
                          </Radio>
                        </Space>
                      </Radio.Group>
                    </DTIFormItem>
                  );
                }}
              </Form.Item>
  <Form.Item shouldUpdate style={{ marginBottom: 0 }}>
                {({ getFieldValue }) => {
                  const timeLimitVal = getFieldValue('timeLimit');// 此处代码是取【是否限制时间】这个表单项
                  return (
                    <DTIFormItem
                      label="限制时段:时间"
                      name="rangeTime"
                      bordered={true}
                      id={styles.detail}
                      className={!timeLimitVal ? styles.disabledTime : ''}
                      rules={[
                        // 自定义验证
                        () => ({
                          validator(_, value) {
                            console.log(value);
                            console.log(timeLimitVal);
                            if (value) {
                              if (timeLimitVal === 1 && value.length !== 2) {
                                return Promise.reject(new Error('请选择限制时间段'));
                              } else {
                                return Promise.resolve();
                              }
                            } else {
                              return Promise.reject(new Error('请选择限制时间段'));
                            }
                          },
                        }),
                      ]}
                    >
                      <TimePicker.RangePicker
                        bordered={false}
                        format="HH:mm"
                        disabled={!timeLimitVal ? true : false}
                        style={{ height: '36px' }}
                        suffixIcon={<DTIIcon type="icon-xialazhankai" />}
                      ></TimePicker.RangePicker>
                    </DTIFormItem>
                  );
                }}
              </Form.Item>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码不是完整的,但重要的思路与精髓都列出来啦,如果大家有疑问的给我留言吧~

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

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

相关文章

LVS-NAT实战案例,实现四层负载均衡

工作原理 架构概述&#xff1a; 在LVS-NAT架构中&#xff0c;客户端的请求首先到达负载均衡器&#xff08;LVS服务器&#xff09;&#xff0c;然后由LVS根据一定的算法将请求转发到后端的真实服务器。负载均衡器会通过NAT技术修改数据包的源地址和目标地址。 数据流转&#xff…

C++之STL—常用遍历算法

算法头文件 <algorithm>是所有STL头文件中最大的一个&#xff0c;范围涉及到比较、 交换、查找、遍历操作、复制、修改等等 <numeric>体积很小&#xff0c;只包括几个在序列上面进行简单数学运算的模板函数 <functional>定义了一些模板类,用以声明函数对象…

Blob数据类型报错时如何获取错误信息

const pdfOrg async (record) > {// 假设 transferExportPdf是结构 result 返回的错误信息let result await transferExportPdf({ batchId: record.batchId });//blob 结构const blob new Blob([result], {type: result.type,});if (blob.type "application/json&q…

【EPLAN】解决ELM与ELC授权不匹配问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决EPLAN授权-ELM与ELC授权不匹配问题&#xff1b; 2、 问题场景 用于解决在EPLAN 服务器端 ELM 授权进行了更新激活&#xff0c;客户端授权连接后&#xff0c;客户端 ELC 授权信息没有变更的情况&#xff0c;尝试…

02 图结构

目录 图的基本概念图的存储结构图的遍历最小生成树最短路径问题 1.图的基本概念 图是由顶点集合及顶点间的关系组成的一种数据结构&#xff1a;G&#xff08;V&#xff0c;E&#xff09;&#xff0c;其中&#xff1a; 顶点集合V{x | x属于某个数据对象集} 是有穷非空集合 E {…

无人机之侦测技术篇

无人机的侦测技术是综合利用多种传感器来“发现”或“找到”无人机目标&#xff0c;并通过分析其物理属性&#xff08;如光学特性、热学特性、声学特性、磁学特性&#xff09;来进行识别和跟踪。 一、雷达探测 原理&#xff1a;雷达系统通过发射电磁波&#xff0c;利用无人机…

15年408计算机网络

第一题&#xff1a; 解析&#xff1a; 接收方使用POP3向邮件服务器读取邮件&#xff0c;使用的TCP连接&#xff0c;TCP向上层提供的是面向连接的&#xff0c;可靠的数据传输服务。 第二题&#xff1a; 解析&#xff1a;物理层-不归零编码和曼彻斯特编码 编码1&#xff1a;电平在…

【小程序 - 大智慧】Expareser 组件渲染框架

目录 问题思考课程目标Web Component类型说明定义组件属性添加 Shadow DOMTemplate and SlotExparser 框架原理自定义组件内置组件 下周计划 问题思考 首先&#xff0c;给大家抛出去几个问题&#xff1a; 前端框架 Vue React 都有自己的组件库&#xff0c;但是并不兼容&#…

Vxe UI vue vxe-table vxe-grid 单元格与表尾单元格如何格式化数据

Vxe UI vue vxe-table vxe-grid 单元格与表尾单元格如何格式化数据 查看 github vxe-table 官网 单元格内容格式化 通过 formatter 属性自定义格式化方法 <template><div><vxe-grid v-bind"gridOptions"></vxe-grid></div> </t…

软考高级:SOA 和微服务 AI 解读

概念讲解 SOA&#xff08;面向服务架构&#xff09;和微服务虽然都是服务架构的设计模式&#xff0c;但它们的侧重点和实现方式有很大区别。为了帮助你理解这两个概念&#xff0c;我们可以从生活中的例子、概念本身的讲解以及记忆方法三方面入手。 生活化例子 **SOA&#xf…

python高级用法_闭包

闭包 在函数嵌套的前提下&#xff0c;内部函数使用了外部函数的变量&#xff0c;并且外部函数返回了内部函数&#xff0c;我们把这个使用外部函数变量的内部函数称为闭包 简单闭包 def outer(logo):def inner(msg):print("<%s>%s<%s>" % (logo, msg, …

JSON与CSV之间的主要区别

今天要和大家深入探讨一个数据处理中的常见问题——JSON与CSV之间的主要区别。这两种数据格式各有千秋&#xff0c;适用于不同的场景。让我们一起来了解它们的特点和应用。 一、数据结构的差异 首先&#xff0c;JSON是一种轻量级的数据交换格式&#xff0c;能够表示复杂的数据…

【JAVA基础】JAVA类的拷贝使用示例

文章目录 一、框架介绍二、性能对比三、易用性对比四、使用示例&#xff08;一&#xff09;Apache Commons BeanUtils 使用例子1、第一个例子&#xff1a;两个对象属性个数和名称一样&#xff0c;复制过程2、第二个例子&#xff1a;属性个数和名称不一样&#xff0c;复制过程 &…

简易STL实现 | 红黑树的实现

1、原理 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树 红黑树具有以下特性&#xff0c;这些特性保持了树的平衡&#xff1a; 节点颜色&#xff1a; 每个节点要么是红色&#xff0c;要么是黑色根节点颜色&#xff1a; 根节点是黑色的。叶子节点&…

信息收集---CDN指纹识别

1. 什么是CDN 在渗透测试过程中&#xff0c;经常会碰到网站有CDN的情况。CDN即内容分发网络&#xff0c;主要解决因传输距离和不同运营商节点造成的网络速度性能低下的问题。说的简单点&#xff0c;就是一组在不同运营商之间的对接点上的高速缓存服务器&#xff0c;把用户经常访…

蓝牙技术|蓝牙6.0技术或将实现厘米级精确查找定位功能

蓝牙技术联盟发布蓝牙 6.0 技术规范&#xff0c;引入了一项名为蓝牙“信道探测”的新功能&#xff0c;可以在两个蓝牙 LE 设备之间实现双向测距&#xff0c;有望为电子设备上的“查找”功能带来更精确的定位能力。蓝牙技术联盟表示&#xff0c;这项新技术将为数十亿未来的蓝牙设…

深度学习:调整学习率

目录 前言 一、什么是调整学习率&#xff1f; 二、调整学习率的作用 三、怎么调整学习率 1.有序调整 2.自适应调整 3.自定义调整 4.调整示例 前言 在深度学习中&#xff0c;调整学习率是非常重要的&#xff0c;它对模型的训练效果和收敛速度有显著影响。 一、什么是调整…

前端问答:如何用 JavaScript 让 HTML Canvas全屏显示

哈喽&#xff0c;大家好&#xff01;今天要跟大家分享一个非常实用的小技巧&#xff0c;适合那些正在学习前端开发的朋友们。你是不是也遇到过这样的问题&#xff1a;在制作一些网页小游戏、炫酷的网页动画或者数据可视化时&#xff0c;想让画布&#xff08;Canvas&#xff09;…

Ubuntu24.04 yum安装

安装yum&#xff1a; sudo apt-get install yum 执行报错 E: Package yum has no installation candidate 解决&#xff1a;更换镜像源&#xff0c;找到自己的系统版本&#xff08;如本系统为Ubuntu24.04&#xff09;用vim进行更换&#xff0c;网址&#xff1a; ubuntu | 镜…

26 基于STM32的智能门禁系统(指纹、蓝牙、刷卡、OLED、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32单片机&#xff0c;六个按键&#xff0c;分别代表指纹、蓝牙、刷卡的正确进门与错误进门&#xff1b; 比如第一个按键按下&#xff0c;表示指纹正确&#xff0c;OLED显示指纹正确&#x…