一个关于 Ant Design 复杂表单设计的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
richards64
V2EX    前端开发

一个关于 Ant Design 复杂表单设计的问题

  •  
  •   richards64 2023-11-08 00:05:47 +08:00 1642 次点击
    这是一个创建于 711 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简单来说,现在的困惑是,我是通过 onValuesChange 方式获取表单数据的,其一是不知道表单校验该怎么做,其二是因为存在通过 setFieldValue 自动填入的联动数据,所以会存在不触发 onValuesChange 导致漏掉数据的情况。

    具体的情况是这样。

    项目里有这么一个页面,存在两级的 Tab 页,其中第一级的 Tab 数量在进入页面时固定,第二由用户控制添加,然后每个 Tab 页下是一个独立的表单页。最后用户输入完成过后,提交一整个 JSON 到接口。最后的 JSON 大概长这样:

    { "name": "xxx", "tab1": [ { "foo": 111, "bar": 222 }, { "foo": 111, "bar": 222 } ], "tab2": [ { "fff": 333, "vvv": 444 }, { "fff": 555, "vvv": 666 } ] } 

    我的做法是在最外层定义了一个 Context ,同时每一种 Tab 各自准备了一个 From 组件。然后绑定 From 的 onValuesChange 事件,一旦触发就用 values 的值更新 Context 。如果用户切换 Tab 的话还是原来的组件,但是从 Context 取值然后再用 setFieldsValue 给 From 赋值,这样用户看上去就是切换页面了。本身页面还涉及到多处跨 Tab 的联动(比如在 tab2 下面修改了第一个子 tab 的 fff 字段的值,tab1 下面的 foo 字段会相应变动),差不多用这种方式也能解决数据联动的问题。

    大部分逻辑算是走通了,但是还是遇到了两个问题。使用 onValuesChange 相当于脱离了 From 的控制,导致正常表单的数据校验没法触发。因为页面上不存在一个单页面提交按钮,所以也不知道什么时机来用代码触发校验;二是同页面联动数据的值是通过 setFieldValue 来做的,但是没想到的是 setFieldValue 不会触发 onValuesChange 事件,导致我不能把更新的值更新到 Context 上,除非用户再正常触发一次 onValuesChange ,但这样做显然不可能。

    很头痛,是不是最初的设计就哪里有点问题?感觉有些不知所措了

    5 条回复    2023-12-02 20:20:14 +08:00
    tudou527
        1
    tudou527  
       2023-11-08 00:39:01 +08:00
    设置 forceRender=true 然后把 2 个 tab 包到一个 <Form /> 中当做一个表单来处理,剩下该怎么校验怎么校验。
    duan602728596
        2
    duan602728596  
       2023-11-09 11:55:05 +08:00
    antd 不是提供了自定义表单控件的方法么?
    https://ant.design/components/form-cn#components-form-demo-customized-form-controls
    DICK23
        3
    DICK23  
       2023-11-14 13:51:26 +08:00
    手动触发校验不行吗?通过调用 formInstance.validateFields()
    zhimayan
        4
    zhimayan  
       2023-11-23 11:53:19 +08:00
    放在一个 Form 里,把用到的组件都封装成 Form 能监听到的格式(默认传 value onChange 这种
    StateMa
        5
    StateMa  
       2023-12-02 20:20:14 +08:00
    约书亚哎 (
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1291 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 17:18 PVG 01:18 LAX 10:18 JFK 13:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86