鍍金池/ 問答/HTML/ antd使用復雜的動態(tài)表單時報錯

antd使用復雜的動態(tài)表單時報錯

數(shù)據的結構是這樣的,需要用這個生成一個如下的表單

{
    name: '', // 名稱
    groups: [ // 組
 
        {
            groupName: '', // 組名
            state: 1, // 是否啟用  1 啟用  0 禁用
            isOpen: 1, // 是否展開  1 展開  0 收起
            fields: [ // 字段
 
                {
                    fieldNameCn: '', // 字段中文名
                    tableName: '', // 表名
                    fieldName: '', // 字段在表中的名字
                    state: 1 // 是否啟用  1 啟用  0 禁用
                            }
            ]
                    }
    ]
}

clipboard.png
點擊新增組按鈕,給groups增加一條數(shù)據,點新增字段給groups[x].fields增加一條數(shù)據,刪除的話反過來

現(xiàn)在循環(huán)出初始的表單,沒問題,使用類似下面的方法來注冊一個antd的field

{getFieldDecorator(`groups[${index}].groupName`, {})()}

現(xiàn)在點擊新增的時候,使用下面的方法設置field會報You cannot set field before registering it.,因為我沒有注冊groups[1].groupName,因為是新增的,我不可能render遍歷的時候就給它注冊掉啊

appGroup = () = > {
    const { form } = this.props;
    const groups = form.getFieldValue('groups');
    const group_empty = this.data_form_empty.groups[0];    // 這個不用管,就是個初始的對象
    const key = `groups[${groups.length}]`
    form.setFieldsValue({    // 這里就會報錯 You cannot set field before registering it.
        [key]: group_empty
    });
}

也嘗試過直接用getFieldDecorator注冊一個groups,然后直接setFieldsValue整個groups。但是由于結構比較復雜,所以還會在getFieldDecorator的時候注冊類似于groups[${index}].groupName這樣的,這樣就會報Warning: One field name cannot be part of another, e.g. a and a.b.

回答
編輯回答
嫑吢丕

說句你不喜歡聽的。我們做過比你這復雜10倍的表單。

出現(xiàn)你描述現(xiàn)象的問題,大多都是解決思路的問題。單擊新增的時候,不要想著給頁面插數(shù)據,而是給數(shù)據插數(shù)據。
state數(shù)據改變的時候,render就會重新渲然。
當你把所有的操作都當作對數(shù)據的操作時,你會發(fā)現(xiàn),很多復雜的東西變得很簡單。

表單插入最容易出問題的不是你提到的,而是在刪除插入表單的時候,錄入的數(shù)據顯示問題。
解決辦法就是每次add時,確保一個永遠都不會重復的id作為key。

2018年4月30日 06:03