Skip to content

form 动态增减表单项 ,减少的时候仍会对删除的表单进行校验 #7672

Closed
@OneAndOnly1111

Description

@OneAndOnly1111

Version

2.13.2

Environment

最新

Reproduction link

https://codepen.io/OneAndOnly1111/pen/wrGjJg?editors=1010

Steps to reproduce

动态增减表单项,每一项是一个panel panel下有好几个form ,发现问题: 如何增加后panel不打开就删除,提交的时候回校验删除掉的panel下的form

What is expected?

动态增减表单可支持多个表单的嵌套

What is actually happening?

不符合预期

Activity

ant-design-bot

ant-design-bot commented on Sep 20, 2017

@ant-design-bot
Contributor

It will be better to write your issue/comment in English, so more people can understand you.
And this means that more people can help you or benefit from your issue/comment.
See: #4897

OneAndOnly1111

OneAndOnly1111 commented on Sep 20, 2017

@OneAndOnly1111
Author

image

benjycui

benjycui commented on Sep 21, 2017

@benjycui
Contributor

Please provide a re-producible demo: http://codepen.io/benjycui/pen/KgPZrE?editors=001

Not just part of your code, thanks.

OneAndOnly1111

OneAndOnly1111 commented on Sep 21, 2017

@OneAndOnly1111
Author

https://codepen.io/OneAndOnly1111/pen/KXMqPO
业务代码在这,但是弄了很久调不出来,恳请看下

benjycui

benjycui commented on Sep 21, 2017

@benjycui
Contributor

无法重现的话,也帮不了你啊。。。

OneAndOnly1111

OneAndOnly1111 commented on Sep 21, 2017

@OneAndOnly1111
Author

https://codepen.io/OneAndOnly1111/pen/BwzmEa?editors=0011
可重现的代码 @benjycui
点击添加后 不展开panel 直接 点击panel上的删除图标,console报错,被删除掉的input没有填写 。。

OneAndOnly1111

OneAndOnly1111 commented on Sep 21, 2017

@OneAndOnly1111
Author

如果添加完先展开一下panel再删除,提交的时候不会再去校验删除掉的,不展开直接删除的话,会去校验已经删除掉的,并且提交按钮点击再也无效。

afc163

afc163 commented on Sep 21, 2017

@afc163
Member

点击添加后 不展开panel 直接 点击panel上的删除图标,console报错

按此步骤无法重现报错。


  • Steps to reproduce
  • What is expected?
  • What is actually happening?

建议按这个格式提供详细的重现步骤,必要的话请补充 Gif 图。

OneAndOnly1111

OneAndOnly1111 commented on Sep 21, 2017

@OneAndOnly1111
Author

@afc163 @benjycui 补录的gif图

jdfw

OneAndOnly1111

OneAndOnly1111 commented on Sep 21, 2017

@OneAndOnly1111
Author

点击添加后 不展开panel 直接 点击panel上的删除图标,然后点击提交按钮,console报错 (之前的是我没说清楚,不好意思)

benjycui

benjycui commented on Sep 22, 2017

@benjycui
Contributor

点击添加后 不展开panel 直接 点击panel上的删除图标

Chrome 下的确没有重现。

如果添加完先展开一下panel再删除,提交的时候不会再去校验删除掉的,不展开直接删除的话,会去校验已经删除掉的,并且提交按钮点击再也无效。

这个我观察到的情况刚好相反,打开后再删除,提交时才会去校验。。

benjycui

benjycui commented on Sep 22, 2017

@benjycui
Contributor

所以还是给出更加详细的步骤,不排除对于某些步骤我们理解不一致,所以操作其实是不一样的。

OneAndOnly1111

OneAndOnly1111 commented on Sep 22, 2017

@OneAndOnly1111
Author

最简单的重现方式,

  1. 点击两下add filed按钮 ,此时添加了2个panel,都不展开
  2. 选择一个panel,点击上面的删除图标,该panel 被删除掉
  3. 点击submit按钮进行提交 ,此时CodePen 的console控制台 出现信息:
    "async-validator:" ["names-1 is required"]
    "async-validator:" ["names-2 is required"]
    不理解的是:对于存在的panel ,其下的的input在没有填写的情况下进行校验是ok的;
    但是,对于刚刚已经删除掉的panel ,仍然对其下的input进行了校验
OneAndOnly1111

OneAndOnly1111 commented on Sep 22, 2017

@OneAndOnly1111
Author

@benjycui 对上述操作录的动图

gaollg0

ChiaJune

ChiaJune commented on Sep 24, 2017

@ChiaJune

我也有这个问题,

OneAndOnly1111

OneAndOnly1111 commented on Sep 24, 2017

@OneAndOnly1111
Author

@ChiaJune 也是使用panel下包含form才有这个问题嘛? 有解决思路的话麻烦分享一下

ChiaJune

ChiaJune commented on Sep 24, 2017

@ChiaJune

@OneAndOnly1111 我不知道是不是一样的。我这里的业务需求是这样的,我要删除/添加多个受控组件而不是单个受控组件,所以我把这些受控组件封装到一个Form类里面,然后来循环输出这个Form类(这里借鉴#4901处理方式)。

如图:5.png

我找出了自己的问题。就是循环时候key的问题。重要的话说三次:key一定要唯一!key一定要唯一!key一定要唯一!哎,之前对于key理解不深刻,这次采坑后肯定不会忘了...

benjycui

benjycui commented on Nov 16, 2017

@benjycui
Contributor

这个问题的原因是:

  1. 新增一个 Panel 时,虽然没有把表单域展现出来,但由于 getFieldDecorator 已经被调用了,所以此时这个表单域已经被注册。
  2. 没打开 Panel 就删除 Panel,由于表单域虽然已经被注册,但没有被渲染过,所以没有触发 unmount 事件,自然也就没有被解除注册。所以对于表单而言,还是已注册的状态,所以也会校验。
  3. 打开 Panel 后再删除,这种情况可以正常触发表单域 unmount,所以可以成功解除注册,自然也不会被校验。
OneAndOnly1111

OneAndOnly1111 commented on Nov 16, 2017

@OneAndOnly1111
Author

目前已经用了一种比较蠢的方法解决了: 新增的Panel默认就给打开。
请问还有其它比较好的解决方案吗?

benjycui

benjycui commented on Nov 16, 2017

@benjycui
Contributor

这个问题如果要遭 Form 里面解决的话,需要把注册这个行为延后到 mount 时,但这样会 break 已有的用法,即直接调用 getFieldDecorator('keys', { initialValue: [] }); 而没有关联具体的组件 https://ant.design/components/form/#components-form-demo-dynamic-form-item

所以还是在业务代码里面处理吧。

const formItems = keys.map((k, index) => {
  return (
    <Panel key={k} header={....}>
      {isVisible ? .... : null}
    </Panel>
  );
});
wuzhidexiaoheizi

wuzhidexiaoheizi commented on Dec 23, 2017

@wuzhidexiaoheizi

一个页面循环输出这么多form元素好吗?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

    Development

    No branches or pull requests

      Participants

      @yesmeck@afc163@benjycui@ChiaJune@wuzhidexiaoheizi

      Issue actions

        form 动态增减表单项 ,减少的时候仍会对删除的表单进行校验 · Issue #7672 · ant-design/ant-design