当前位置: 首页 > 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();
}} />

http://www.lryc.cn/news/400450.html

相关文章:

  • 7.16做题总结
  • unity使用 MQTT复现plant simulate仿真
  • MATLAB激光通信和-积消息传递算法(Python图形模型算法)模拟调制
  • 初识HTML
  • 基于Rspack实现大仓应用构建提效实践|得物技术
  • 什么是MOW,以bitget钱包为例
  • pytorch说明
  • AI语音机器人是否可以设计开放式问题
  • ModuleNotFoundError: No module named
  • 【操作系统】进程管理——用信号量机制解决问题,以生产者-消费者问题为例(个人笔记)
  • 算法刷题笔记 KMP字符串(C++实现,并给出了求next数组的独家简单理解方式)
  • SpringCloud架构师面试
  • C语言 | Leetcode C语言题解之第228题汇总区间
  • 入职前回顾一下git-01
  • this指向解析
  • 学习小记-Nacos的服务注册与发现原理
  • 视频号矩阵系统源码,实现AI自动生成文案和自动回复私信评论,支持多个短视频平台
  • [Spring] SpringBoot基本配置与快速上手
  • tomcat的优化、动静分离
  • Python与自动化脚本编写
  • 树与二叉树
  • SpringBoot+Vue实现简单的文件上传(Excel篇)
  • 科研绘图系列:R语言金字塔图(pyramid plot)
  • Tomcat多实例
  • 前端Vue组件化实践:自定义加载组件的探索与应用
  • 半小时获得一张ESG入门证书【详细中英文笔记一】
  • 类形断言和和类型推导的区别是什么?
  • Spring-Spring、IoC、DI、注解开发
  • Facebook的未来蓝图:从元宇宙到虚拟现实的跨越
  • Redis6.2.1版本集群新加副本