New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Form.List support noRecord
#21725
Comments
hi @jjwong1991 ~ 数据绑定是来自于 {
list: [1, undefined, undefined, 5]
}
|
How do you think about this. @afc163 @shaodahong @mgcrea @mgcrea Let me trans in English simplify. @jjwong1991 wish {
list: [1, undefined, undefined, 5]
} |
@zombieJ 明白您所说的,如果整体隐藏一个list的直接子元素会产生这样的问题。 |
个人建议是对于打洞的 Form.List 可以自己封装一个 List 组件,跳过上层注册步骤。 |
我认为表单校验和最后Finished获取的值应该用同样的规则,既然校验通过了,最后的值也应该是校验后的值。 |
确实有问题,如果隐藏了按理来说确实是需要干掉的,但是实际业务上对于数组结构的数据更多的是手动增删改,如果 Form 底层帮忙处理了反而不太好 这个例子: |
<Form.Item>的数据绑定的表现我觉得还是统一比较好,不然list内外的<Form.Item>表现却不一致,很让人困扰 |
这个就是问题所在,List 太灵活了,Item 是对象关系的渲染,List 是数组关系的渲染,数组结构在 Form 表单的表现应该是一致的,不应该需要用户自己再去写 Item,直接 <Form.List name="list" render={({add, remove}) => <Input />}> 就好了 |
数据绑定不是来自于 Form.Item,而是来自上层的 Form.List。就如同 @shaodahong 的例子,用户在 Form.List 里甚至可以不用写 Form.Item。如果用户直接调用了 Data binding does not come from From.Item. It's parent Form.List instead. User can even use it without Form.Item like @shaodahong 's sample. If user call |
@zombieJ Fom.List在页面上表现为数组没问题,问题的点是,当Form.List内有Form.Item去描述数组内的对象结构时,Form.Item的变化没有再和数据映射起来,但是在Form.List外却又是正常映射的,这很奇怪 |
类似这样的结构中,在 {
list: [
{
value1: "",
value2: "",
},
],
} 在 {
list: [
{
value2: "",
},
],
} 但是现在在 {
list: [
{
value1: "",
value2: "",
},
],
}
|
@jjwong1991 你的这个是条件渲染,底层是没办法知道的,我上面也提到了实际业务增删基本上都是手动对对应的某一项删除或者整体新增 |
{
list: [
{
value1: "", // Should hide
value2: "",
},
],
} 这个例子感觉也有些道理,不同于打洞,List 注册子元素又做了一层分叉路径的确是按照分叉的走更合理。或许 Form.List 的确需要有一个诸如 Rather than holy list, this example make sense for sub field register additional nest fields. Maybe we can ddd |
@shaodahong 是条件渲染没错,但是Form知道哪些渲染哪些没渲染,在执行表单校验和获取值时都会跳过没渲染的组件。而FormList内的组件则会在验证时被跳过,在取值时被取到。底层可以获取到何时触发校验,却不能获取到合适应该收集值,这说不通 |
@zombieJ 所以我在想是否可以这样,当FormList内没有FormItem时,可以像现在的绑定逻辑来处理,保证不会出现打洞的情况;当FormList内有FormItem时,FormList只作为一个提供name前缀的组件,内部的FormItem的name被拼装成 |
自动收集太黑盒了,还是应该交由用户来选择。否则也会遇到其他类似这个 issue 的预期问题。 Automatic collection is in black box. We should let user to handle this. |
条件渲染底层是不知道对应的那个的,没有被验证是因为这个 item 已经不存在了,在显示的时候输入触发收集,值已经缓存住了,切换到隐藏状态虽然条件渲染干掉了这个 item,但是已存在的 key 并没有干掉,validateFields 校验是根据对应 item 的 rule 来的 (然而已经被干掉了),想要解决这种情况我觉得就是要限制用户对 List 的渲染控制,不需要放开 Children 给他们,只需要提供类似 render 的就行 |
而且从我的实际操作来看,我更希望 Form 提供配置化,因为手写 Item 这些重复性太多了 // render edit 模式下 默认渲染 <Input /> view模式下 渲染 value
const cloumns = [
{name: 'name', rules: []},
{name: 'age', rules: [], render: () => <Select />}
]
<Form mode={edit | view} cloumns={columns} /> |
我觉得加一个配置项是可取的,就像getFieldsValue(ture)这样来控制是否全量取值,当不传参数的时候就取页面渲染组件的值 |
嗯,我指的就是在 Form.List 加一个属性来支持。 Yes. I mean to add a prop on the Form.List. |
辛苦了 近期是否有升级计划呢 |
可以在 feature 里弄一个。我打个标。 |
noRecord
请问一下这个目前有更新计划了吗~ |
暂时没有,收集一波 Form feedback 后再一起搞一搞。 |
is there a way to provide an initial state to the form.list. I mean a prefilled form items inside the form.list? |
这个问题有结论了吗 能改么 |
Reproduction link
Steps to reproduce
What is expected?
Form.List
内的Form.Item
隐藏后在收集值时可以符合页面表现当
<Form.List>
中的<Form.Item name={[index, "xxx"]}>
不渲染时收集值应不包含
list[index].xxx
。<Form.List>
中的<Form.Item name={[index, "xxx"]}>
应该等同于直接在
<Form>
内书写<Form.Item name={["list", index, "xxx"]}>
去作为数据绑定
而不能因为是
Form.List
的子元素,表单项<Form.Item name={[index, "xxx"]}>
的显隐变化在收集值时就被忽略掉。
<Form.Item name={[index, "xxx"]}>
不渲染时,收集的值应该为
而非
What is actually happening?
<Form.List>
中的<Form.Item name={[index, "xxx"]}>
在未渲染时,值仍然被收集。在#21713 中并未解决我说的问题
The text was updated successfully, but these errors were encountered: