Ant Design4中Form.List和shouldUpdate一起使用的坑

news2024/10/6 4:10:15

背景

        在antd3.x版本中,如果要实现一组表单增加删除的功能,需要Array.map()加上state状态来控制,代码比较复杂,而且非常不优雅。

        其次在antd3.x中,表单中任何一个表单项的内容更新都会触发页面重新渲染,这在一个巨型表单页面上简直是灾难。(但是这对于表单联动却是非常方便的,只需要在需要联动的表单前加上判断语句即可)

        因此。antd4相对于antd3对表单进行了一些优化,其中就增加了Form.List这个API和shouldUpdate方法。

        其中Form.List为字段提供数组化管理,可用于动态增加删除移动表单项。

        Form.Item上的shouldUpdate方法用来自定义字段的更新逻辑。

        但是其中有一些坑真让人头大

坑1:同时联动多个表单,样式问题

        首先,antd3中实现联动的方法在4版本中并不好使,原因就是在antd4中表单内容的更新并不会触发页面的渲染。在antd4中我们有两种方法可以用来控制表单联动,那就是dependencies方法和shouldUpdate方法。

        对比了一下官方文档的两种方法,个人感觉

        dependencies适用于针对依赖字段重新触发校验逻辑的场景

        shouldUpdate适应于针对依赖字段对某一区域进行渲染的场景

        所以我们就采用shouldUpdate方法来处理联动。但是当我们实际开发过程中,如果我们是控制一个表单项的联动还好,如果同时控制多个表单项联动,有两种方案

// 方案1:

<Form.Item noStyle shouldUpdate={(prevValues, curValues) => { return prevValues.type !== curValues.type; }} >
    {() => {
        return <Form.Item label="名字" name={'name'} >
            <Input placeholder='请输入' />
        </Form.Item>
    }}
</Form.Item>
<Form.Item noStyle shouldUpdate={(prevValues, curValues) => { return prevValues.type !== curValues.type; }} >
    {() => {
        return <Form.Item label="年龄" name={'age'} >
            <Input placeholder='请输入' />
        </Form.Item>
    }}
</Form.Item>


// 方案2:
<Form.Item noStyle shouldUpdate={(prevValues, curValues) => { return prevValues.type !== curValues.type; }} >
    {() => {
        return <>
            <Form.Item label="名字" name={'name'} >
                <Input placeholder='请输入' />
            </Form.Item>
            <Form.Item label="年龄" name={'age'} >
                <Input placeholder='请输入' />
            </Form.Item>
        </>
    }}
</Form.Item>

        如果采用第一种方案,代码会比较冗余,而且如果表单有多处联动,不太容易区分哪个是联动哪个的,因为是平铺下来的嘛

        如果采用第二种方案,会很直观的看出来,某处联动会联动哪几个表单。但是这里有个坑,即使我们设置了noStyle和空标签,被关联的多个表单还是会被一个div包裹起来。这会带来的后果就是,假设一行只有一个固定字段,其他都是被关联的字段,当被关联字段超过了一行能容纳的个数的话会整体换行,导致第一行只留下一个字段,样式布局则会很奇怪。如图

        针对这个问题,目前还没想到完美的解决方案,如果有比较好想法的小伙伴,欢迎分享你的想法哟。

坑2:不管是通过dependencies方法还是shouldUpdate方法。当我们通过联动,隐藏某几个表单项后,已收集到form中的数据并不会删除。

<Form.Item noStyle shouldUpdate={(prevValues, curValues) => { return prevValues.type !== curValues.type }} >
    {({ getFieldValue }) => {
        const type = getFieldValue('type');
        if (type === '1') {
            return <>
                <Form.Item label="名字" name={'name'} >
                    <Input placeholder='请输入' />
                </Form.Item>
                <Form.Item label="年龄" name={'age'} >
                    <Input placeholder='请输入' />
                </Form.Item>
            </>
        } else if (type === '2') {
            return <Form.Item label="性别" name={'sex'} >
                <Input placeholder='请输入' />
            </Form.Item>
        }
        return null
    }}
</Form.Item>

        看下面代码,这段代码是当表单中type类型为1时 ,展示名字和年龄字段,当type为2时,展示性别字段

        如果我们将type切换成1再切换成2, 表单中会存在名字和年龄,但是在页面上并不存在这两个表单项。

        这并不会影响什么,但是个人感觉很不干爽,如果表单变大变复杂,提交表单时也会提交过去一些可能并不需要的字段。因此我们最好删除掉不需要的字段。

这个问题,能够直接想到两种方案。

        方案1:在最后提交表单的时候做一下特殊处理。将多余的字段删除后再提交。但是如果在提交前再次回显表单项的时候,还是会回显之前残留的数据,时机太晚。

        方案2:在表单联动隐藏的时候,对字段进行重置。考虑使用resetFields,但是经过实践并不好用。可以采用setFieldsValue或setFields对字段进行重置,在如下位置添加相应重置逻辑

<Form.Item noStyle shouldUpdate={(prevValues, curValues) => { return prevValues.type !== curValues.type }} >
    {({ getFieldValue }) => {
        const type = getFieldValue('type');
        if (type === '1') {
            {/** 重置表单内容,并初始化名字和年龄 */ }
            return <>
                <Form.Item label="名字" name={'name'} >
                    <Input placeholder='请输入' />
                </Form.Item>
                <Form.Item label="年龄" name={'age'} >
                    <Input placeholder='请输入' />
                </Form.Item>
            </>
        } else if (type === '2') {
            {/** 重置表单内容,并初始化性别 */ }
            return <Form.Item label="性别" name={'sex'} >
                <Input placeholder='请输入' />
            </Form.Item>
        }
        return null
    }}
</Form.Item>

        如果表单是固定的话,单独这样写是没啥问题的。

        如果我们使用formList来为字段提供数组化管理,动态增减表单项的话。上述方法则会出现一个新的坑。

坑3: formList重新渲染的问题

        在上述代码的基础上,如果我们通过formList来包裹的话。正常情况是相互并不干扰的,但是,如果我们使用formList的add或remove方法,则会触发formList的重新渲染,带来的后果则是,重置每一组的表单内容。

        解决办法是将重置逻辑写到type表单项的onchange方法中即可

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

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

相关文章

自定义MVC引用XML配置文件实现

目录 前言 自定义MVC实现 1. 导入XML配置文件 2. 导入XML解析建模 3. 优化中央控制器 3.1 修改DisPathServlet中init初始化方法 3.2 修改ActionServlet逻辑处理流程 3.3 通过反射机制实例化子控制器类 3.4 中央控制器将请求委托给子控制器处理 3.5 根据请求结果码跳…

【运维工程师学习】低级格式化磁盘

【运维工程师学习】低级格式化磁盘 1、查看需要格式化的磁盘2、下载低级格式化工具3、打开低级格式化工具&#xff0c;选择目标磁盘&#xff0c;并操作 1、查看需要格式化的磁盘 找不到目标磁盘的话需要到磁盘管理去找&#xff0c;这边我要低级格式话的磁盘是磁盘0 2、下载低级…

BPMNJS 在HTML中的引入与使用

BPMNJS 在HTML中的引入与使用 在网上看到的大多是基于vue使用BPMN的示例或者教程&#xff0c;竟然没有在HTML使用的示例&#xff0c;有也是很简单的介绍核心库的引入和使用&#xff0c;并没有涉及到扩展库。于是简单看了下&#xff0c;真的是一波三折&#xff0c;坎坎坷坷。不过…

vue使用mapbox地图

1、下载依赖 npm install --save mapbox-gl mapbox/mapbox-gl-language 2、引入mapBox&#xff0c;将引入的内容封装为js文件 在api/map文件夹下新建mapbox.js文件 代码&#xff1a; import mapboxgl from mapbox-gl import mapbox-gl/dist/mapbox-gl.css import MapboxLang…

vue表单验证的时候提示 async-validator:‘‘xxx is not a string“

对vue不是很熟悉&#xff0c;在做vue开发的时候&#xff0c;遇到一个很奇怪的问题&#xff0c;输入框涉及到number类型的时候会提示 is not a string 这块的代码是这样的&#xff1a; v-decorator"[ fraction, { rules: [{ required: true, type: number, message: 请输入…

SQL Server中如何将累积数值拆解

概要 本文通过一个计算汽车每日里程数的例子&#xff0c;展现如何通过汽车每日的总里程数&#xff0c;来计算汽车每日的里程数。 代码及实现 每辆汽车中都有一个里程数表&#xff0c;记录汽车从出场到当前行驶的里程数&#xff0c;下表是一样汽车的里程数表&#xff0c;该表…

Elastic Stack之Logstash Beats

文章目录 Logstash简介&运行流程使用&#xff08;日志采集&#xff09;常用操作查看线程 BeatFilebeat Logstash 简介&运行流程 教程 一文快速上手Logstash 使用&#xff08;日志采集&#xff09; 配置logstash使用elasticsearch作为logstash后端 在logstash\bin目录…

Spring容器获取Bean的9种方式 | 京东云技术团队

1 前言 随着SpringBoot的普及&#xff0c;Spring的使用也越来越广&#xff0c;在某些场景下&#xff0c;我们无法通过注解或配置的形式直接获取到某个Bean。比如&#xff0c;在某一些工具类、设计模式实现中需要使用到Spring容器管理的Bean&#xff0c;此时就需要直接获取到对…

postgres数据库基础操作-ok

文章目录 1. 链接数据库2. 库操作2.1 创建库2.2 查看数据库2.3 切换数据库2.4 修改库名2.5 删除数据库 3. 表操作3.1 创建表3.2 查看table list3.3 删除表 4. 数据操作4.1 插入数据4.2 查询数据4.3 删除数据 5. 用户&权限5.1 创建用户5.2 查看用户5.3 删除用户5.4 修改用户…

spring cloud +java企业工程管理系统源码之提高工程项目管理软件的效率

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中&#xff0c;管理不畅以及不良的项目执行&#xff0c;往往会导致项目延期、成本上升、回款拖后&#xff0c;最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统&#xff0c;确保…

5.设计模式之思维导图整理

1.七大原则 2.分类 3.23大设计模式 //展开 ![ 在这里插入图片描述](https://img-blog.csdnimg.cn/070e9ba070a54a22ab4a05653ae1cf27.png)

钡铼技术多功能RTUS475:稳定可靠的油田数据采集解决方案

标题&#xff1a;S475在油田数据采集中的应用 摘要&#xff1a;本文介绍了钡铼技术多功能RTUS475在油田数据采集中的应用。该设备基于高性能微处理器MCU和嵌入式实时操作系统&#xff0c;支持Modbus Slave和Modbus Master功能&#xff0c;并能通过无线网络实现短信报警和数据传…

华为OD机试真题 Python 实现【木板】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、Python算法源码五、效果展示1、输入2、输出3、说明 一、题目描述 小明有n块木板&#xff0c;第块木板的长度为a_i。 小明买了一块长度为m的木料&#xff0c;这块木料可以切割成任意块&#xff0c;拼接到已有的木板上&#xff0…

虚机Centos忘记密码如何重置 -- 小黑日常超细教学

有时候虚机太多&#xff0c;会忘记有一些虚机的密码&#xff0c;当启动机器的时候那我们可以尝试重置虚机密码然后登录。 日常的小技能记述&#xff01;&#xff01; 目录 一、 演示虚机为centos7系列 二、进入开机前的页面&#xff0c;选中第一个&#xff0c;按“e”键&…

idea中如何过滤某些文件不提交

文章目录 前言设置.gitignore文件解决方案 设置新的忽略文件具体步骤如下 常用过滤文件 前言 在开发过程中&#xff0c;经常会遇到一些文件是我们不想提交的内容。那么应该如何过滤掉&#xff1f;不去提交到我们的git仓库&#xff1f; 比如&#xff0c;我们常用的一些配置文件…

MBD开发 STM32 UASRT

目录 轮询 ptintf 中断方式 DMA方式 轮询 串口要加入这两个文件 bug在于接到10个后会一直发送 ptintf function buffPtr convert(buff)if coder.target(Sfun)%固定句式%Executing in MATLAB, Buff is nullbuffPtr uint32(0); elsecoder.cinclude(getBuffPtr.h);%加入头…

Apikit 自学日记:智能 Mock 规则

功能入口&#xff1a;API管理应用 / 公共资源菜单 / 智能 Mock 设置 二级菜单在编写API文档返回结果时&#xff0c;若参数字段和类型匹配智能Mock规则&#xff0c;系统则会自动填入对应的Mock值。该功能提供无感的快速mock值配置&#xff0c;减轻mock规则配置的工作负担。 智能…

Dubbo学习记录

Dubbo学习记录 一、Dubbo架构二、Provider启动Dubbo1.实现类的Service注解2.Dubbo的配置信息3.引入web.xml&#xff0c;加载Spring核心配置文件&#xff0c;才可以扫描到Dubbo的配置信息 二、Consumer启动Dubbo1.Autowired改为Reference2.qos介绍&#xff1a;Dubbo远程监控和控…

LeetCode 打卡day54-55 动态规划之编辑距离问题

一个人的朝圣 — LeetCode打卡第54-55天 知识总结 Leetcode 392. 判断子序列题目说明代码说明 Leetcode 115. 不同的子序列题目说明代码说明 Leetcode 583. 两个字符串的删除操作题目说明代码说明 Leetcode 72. 编辑距离题目说明代码说明 知识总结 今天学习动态规划里面的编辑…

《零基础学PIC单片机》目录

《零基础学PIC单片机》目录 1.《零基础学PIC单片机》&#xff0c;作者&#xff1a;赵化启 1.1芯片架构和指令 芯片架构和指令需要较多时间消化。 PIC单片机系统结构&#xff0c;讲解各模块的结构和功能&#xff1b;PIC汇编指令 1.2具有参考价值的内容 第3章&#xff1a;电…