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

ant design form动态增减表单项Form.List如何进行动态校验规则

        项目需求:

        在使用ant design form动态增减表单项Form.List时,Form.List中有多组表单项,一组中的最后一个表单项的校验规则是动态的,该组为最后一组时,最后一个表单项是非必填项,其他时候为必填项。假设动态增加了两组表单项,均为填写内容,在必填项校验被触发后,删除了第二组表单项,此时仅剩一组表单项,想要最后一个表单项的校验状态不再显示必填项提示。如下图所示:

想要的效果,最后一个表单项不显示必填项提示:       

        解决思路:

        使用动态校验规则,获取到最后一组的索引,使用form.validateFields重新触发校验规则。

        代码如下:

import React, { useState } from 'react';
import { Form } from 'antd';const App = () => {const [lastIndex, setLastIndex] = useState(false); // form表单最后一组数据的索引const [form] = Form.useForm();useEffect(() => {// 减少表单项时,重新触发表单验证,使form最后一组中最后一个表单项的验证状态不再显示必填项提示form.validateFields([['configs', lastIndex, 'lastFormOption']]);}, [lastIndex, form]);return (<Form form={form} initialValues={{ configs: [{}] }} >……<Form.List name="configs">{(fields, { add, remove }) => (<>{fields.map(({ key, name, ...restField }, index) => {// 这里获取最后一组表单项索引setLastIndex(fields.length - 1);return (<Rowkey={key}>……<Col span={5}><Form.Item{...restField}name={[name, 'lastFormOption']}rules={[{required: (fields.length - 1) == index ? false : true,message: '请选择……',},]}><Selectoptions={options}disabled={(fields.length - 1) == index}placeholder="最后一条自定义条件为非必填项"/></Form.Item></Col><Col span={2}><MinusCircleOutlined onClick={() => remove(name)} /></Col></Row>)})}<Form.Item ><Button type="dashed" onClick={() => add()} block icon={<PlusOutlined />}>新增</Button></Form.Item></>)}</Form.List></Form>);
};
export default App;

        上述解决方式中,如果App作为一个子组件用到了ForwardRef,会出现下面的告警:

        Warning: Cannot update a component (`ForwardRef(AddRemoveFormItems)`) while rendering a different component (`Field`). To locate the bad setState() call inside `Field`, follow the stack trace as described……

        解决方案:去掉setLastIndex(fields.length - 1);等相关代码,将规则校验放在删除表单组的操作中。代码如下:

<MinusCircleOutlined style={{ fontSize: 24 }} onClick={() => {remove(name);form.validateFields();
}} />

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • AI安全系列——[第五空间 2022]AI(持续更新)
  • 使用 Apache Pulsar 构建弹性可扩展的事件驱动应用
  • 【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十)-服务体验保证的用例
  • 用虚拟机,可以在x86的电脑上虚拟出arm的电脑吗
  • 【轻松拿捏】Java-final关键字(面试)
  • Jmeter-单用户单表查询千条以上数据,前端页面分页怎么做
  • 【Git 学习笔记】第四章 git rebase 变基操作与相关示例(上)
  • 利用OSMnx进行城市路网数据的速度与通行时间推算及分析
  • 【.NET全栈】ASP.NET开发web应用——ASP.NET中的样式、主题和母版页
  • 今天此文堪比出师表最后一句话
  • Redis的中BitMap的应用
  • leetcode算法题(反转链表)
  • CentOS 7 Web面板的文件管理器说明
  • Kotlin Misk Web框架
  • 无人机之机架类型篇
  • 4. 路由到控制器 - Laravel从零开始教程
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ECMAScript6(0):ES6简明参考手册
  • JavaWeb(学习笔记二)
  • Js基础——数据类型之Null和Undefined
  • Puppeteer:浏览器控制器
  • spark本地环境的搭建到运行第一个spark程序
  • 百度地图API标注+时间轴组件
  • 分享几个不错的工具
  • 浅谈Golang中select的用法
  • 一些关于Rust在2019年的思考
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​ubuntu下安装kvm虚拟机
  • #### golang中【堆】的使用及底层 ####
  • #define 用法
  • #传输# #传输数据判断#
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (1)(1.13) SiK无线电高级配置(六)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (二十四)Flask之flask-session组件
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (五)网络优化与超参数选择--九五小庞
  • (转)ORM
  • (转)Sublime Text3配置Lua运行环境
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net dataexcel 脚本公式 函数源码
  • .net 流——流的类型体系简单介绍
  • .Net 应用中使用dot trace进行性能诊断
  • .Net6使用WebSocket与前端进行通信
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET设计模式(11):组合模式(Composite Pattern)
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • []串口通信 零星笔记
  • [20161101]rman备份与数据文件变化7.txt