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

这篇具有很好参考价值的文章主要介绍了Ant Design4中Form.List和shouldUpdate一起使用的坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

        在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包裹起来。这会带来的后果就是,假设一行只有一个固定字段,其他都是被关联的字段,当被关联字段超过了一行能容纳的个数的话会整体换行,导致第一行只留下一个字段,样式布局则会很奇怪。如图

Ant Design4中Form.List和shouldUpdate一起使用的坑,前端,react,Ant Design

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

坑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方法中即可文章来源地址https://www.toymoban.com/news/detail-525048.html

到了这里,关于Ant Design4中Form.List和shouldUpdate一起使用的坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • React安装ant design组件库,并使用

    ant design是一个很棒的组件库,官方地址:快速上手 - Ant Design 但是如何在React里面用起来,好像并不是很顺畅,没有像Vue里面那么友好,因为我踩过这个坑,虽然安装很简单,但是想要出样式,还是有点步骤的。 npm命令: yarn命令: pnpm命令: 千万不要简单的只看官方的文档

    2024年02月14日
    浏览(37)
  • ❤ Ant Design Vue 2.28的使用

    2024年02月11日
    浏览(29)
  • Ant Design Mini 在小程序中的使用

    今天来给大家分享一下 Ant Design Mini 在原生小程序中或者uniapp中的使用 目录 在原生微信小程序中使用 在 uni-app 中使用 在支付宝小程序中引用 在微信小程序中引用 1. 安装依赖 npm i antd-mini --save 2. 构建 npm 安装好依赖以后,点击开发者工具中的菜单栏:工具 -- 构建 npm 3. 在项

    2024年04月09日
    浏览(69)
  • 下载使用 ant design Pro 中遇到的一些问题

    npm v9.6.3 is known not to run on Node.js v19.9.0. This version of npm supports the following node versions: ^14.17.0 || ^16.13.0 || =18.0.0 . You can find the latest version at https://nodejs.org/. 需要更新npm版本 无法加载文件 F:nvmnodejstyarn.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.c

    2024年02月05日
    浏览(39)
  • React——Ant Design组件库Message全局提示的使用

    官网推荐使用Hook调用的方法         这种方法只能在本页显示,如果显示后跳转页面就不会显示。因为{contextHolder}是写在本页面的。如果需要跳转页面可以用promise调用 传递的参数依次为,提示信息、显示时间、关闭后触发的回调

    2024年02月11日
    浏览(31)
  • Ant Design Vue表格(Table)及分页(Pagination )使用

    最近在写一个新项目,UI框架用的是 Ant Design Vue ,因为之前一直用的 Element UI ,没有用过这个组件库,没想到二者区别这么大,因此踩了不少坑,其中就有 Table 和 Pagination ,花了一会时间才弄明白,在此记录并分享一下此次经历。 注意:是 Vue3 项目。 Table 的使用相对比较简

    2024年02月10日
    浏览(34)
  • 使用 Ant Design Vue 你可能会遇到的14个问题

    公司有一个新需求,在原来项目基础上开发,项目中使用 Ant Design Vue,版本是 1.X ,在此记录下遇到的问题;对于没有使用过或者使用程度不深的同学来说,希望可以帮助你在开发中遇到问题时有个参考。对于已经熟练使用的同学,可能这些问题都遇到过,欢迎大家在评论区补

    2024年02月08日
    浏览(24)
  • Ant-design-vue AutoComplete 自动补全组件的使用

    AutoComplete 是一个输入框自动完成功能,在输入时提个建议或者辅助提示。 和 Select 的区别是: AutoComplete 是一个带提示的文本输入框,用户可以自由输入,是辅助输入 Select 是在限定的可选项中进行选择,是选择。 使用案例如下: filterOption 是否根据输入项进行

    2024年02月12日
    浏览(33)
  • ant-design-vue中table组件使用customRender渲染v-html

    ant-design-vue遇到table中列表数据需要高亮渲染 1、customRender可以使用,但是使用v-html发现不生效还报错 2、customRender函数返回肯定是jsx语法,于是发现这样写可以

    2024年02月15日
    浏览(35)
  • Ant Design 使用出现 Error: Can‘t resolve ‘~antd/dist/antd.css‘

    在运行Recat-Ant Design项目安装依赖时发现控制台报错 发现是css引入文件路径有问题,沿着这个路径找可以看到引入文件已经改名了 去文档官网看了一下在5.2.2版本中的引入文件名确实已经改变了 其实就是版本升级问题 改变文件名,项目就成功启动了 而且在这个版本中的Ant

    2024年02月11日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包