单纯的人 發表於 2020-9-1 10:48:00

react antd动态增减表单

<p>之前写动态表单遇到过坑,就是用index下标做key会导致bug,而且很严重!</p>
<p>今天有空写下文章记录下:怎么处理和逻辑</p>
<p>我用的是antd3的版本,3和4的表单有点不一样,不过差别应该不大。</p>
<p><strong>需求:</strong></p>
<p>1、选择类型切换展示固定的模板</p>
<p>2、通过新增字段可以动态增减表单里面的每一行</p>
<p>3、控制每一行的字段是否需要必填</p>
<p>4、编辑时候回填参数</p>
<p><strong>效果图:</strong></p>
<p><img src="https://img2020.cnblogs.com/blog/1740855/202009/1740855-20200901101916854-2043944553.png"></p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/1740855/202009/1740855-20200901102425706-1590277978.png"></p>
<p><img src="https://img2020.cnblogs.com/blog/1740855/202009/1740855-20200901104944173-2114217815.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>部分关键代码:</strong></p>
<div class="cnblogs_code">
<pre>import React, { Component } from 'react'<span style="color: rgba(0, 0, 0, 1)">;
import styles from </span>'./index.less'<span style="color: rgba(0, 0, 0, 1)">;
import {
Table,
Button,
Select,
Popconfirm,
Modal,
Form,
Input,
Radio,
Row,
Col, Tooltip,
Icon,
message,
Pagination, InputNumber,
} from </span>'antd'<span style="color: rgba(0, 0, 0, 1)">;</span><span style="color: rgba(0, 0, 0, 1)">

const Option </span>=<span style="color: rgba(0, 0, 0, 1)"> Select.Option;
const FormItem </span>=<span style="color: rgba(0, 0, 0, 1)"> Form.Item;

let id </span>= 0<span style="color: rgba(0, 0, 0, 1)">;

@Form.create()
class Index extends Component {
marketId </span>= 0<span style="color: rgba(0, 0, 0, 1)">;
state </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    selectType: </span>''<span style="color: rgba(0, 0, 0, 1)">,
    orderType: </span>1,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">文章1地图2</span>
    typeLoading: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
    isEdit: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
    lookVisible: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
    visible: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
    pageSize: </span>10<span style="color: rgba(0, 0, 0, 1)">,
    pageNum: </span>1<span style="color: rgba(0, 0, 0, 1)">,
    keyWord: </span>''<span style="color: rgba(0, 0, 0, 1)">,
    row: {},
    typeList: {},
    mock: {},
    mapType: [{
      </span>'fieldName': 'name'<span style="color: rgba(0, 0, 0, 1)">,
      </span>'isImg': 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>'order': 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>'remarks': '名称'<span style="color: rgba(0, 0, 0, 1)">,
    }, {
      </span>'fieldName': 'label'<span style="color: rgba(0, 0, 0, 1)">,
      </span>'isImg': 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>'order': 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>'remarks': '标签'<span style="color: rgba(0, 0, 0, 1)">,
    }, {
      </span>'fieldName': 'lon'<span style="color: rgba(0, 0, 0, 1)">,
      </span>'isImg': 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>'order': 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>'remarks': '经度'<span style="color: rgba(0, 0, 0, 1)">,
    }, {
      </span>'fieldName': 'lat'<span style="color: rgba(0, 0, 0, 1)">,
      </span>'isImg': 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>'order': 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>'remarks': '纬度'<span style="color: rgba(0, 0, 0, 1)">,
    }],
    articleType: [{
      </span>'fieldName': 'name'<span style="color: rgba(0, 0, 0, 1)">,
      </span>'isImg': 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>'order': 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>'remarks': '名称'<span style="color: rgba(0, 0, 0, 1)">,
    }, {
      </span>'fieldName': 'label'<span style="color: rgba(0, 0, 0, 1)">,
      </span>'isImg': 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>'order': 0<span style="color: rgba(0, 0, 0, 1)">,
      </span>'remarks': '标签'<span style="color: rgba(0, 0, 0, 1)">,
    }],
};
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 将动表单态值生成需要的数据格式
   * @param values
   * @returns {[]}
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
createValues </span>= (values) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    const { row } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
    const data </span>=<span style="color: rgba(0, 0, 0, 1)"> [];
    const newValues </span>= { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 用新的对象承载提交的数据</span>
<span style="color: rgba(0, 0, 0, 1)">      ...values,
    };
    const fieldNameData </span>= []; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 保存fieldName值</span>
    const remarksData = []; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 保存remarks值</span>
    const isImgData = []; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 保存isImg值</span>
    const orderData = []; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 保存orderData值</span>
    const fieldName = RegExp(/fieldName/<span style="color: rgba(0, 0, 0, 1)">);
    const remarks </span>= RegExp(/remarks/<span style="color: rgba(0, 0, 0, 1)">);
    const isImg </span>= RegExp(/isImg/<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (const key <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> newValues) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (fieldName.test(key)) {
      fieldNameData.push(newValues);
      }
    }
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (const key <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> newValues) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (remarks.test(key)) {
      remarksData.push(newValues);
      }
    }
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (const key <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> newValues) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (isImg.test(key)) {
      isImgData.push(newValues);
      }
    }
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (const key <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> newValues) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (isImg.test(key)) {
      orderData.push(newValues);
      }
    }
    fieldNameData.forEach((item, index) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      data.push({
      fieldName: item,
      remarks: remarksData,
      isImg: isImgData,
      order: orderData,
      id: row.dataType </span>? row.dataType.id : ''<span style="color: rgba(0, 0, 0, 1)">,
      });
    });
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> data;
};

handleOk </span>= e =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.props.form.validateFields((err, values) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">err) {
      const { row, isEdit } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
      const params </span>=<span style="color: rgba(0, 0, 0, 1)"> {
          dataType: {
            name: values.name,
            type: values.type,
            id: row.dataType </span>? row.dataType.id : ''<span style="color: rgba(0, 0, 0, 1)">,
          },
          typeFields: [],
      };
      params.typeFields </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.createValues(values);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (isEdit) {
          editType(params).then(res </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (res.code === 0<span style="color: rgba(0, 0, 0, 1)">) {
            message.info(</span>'修改成功'<span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
                visible: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
                isEdit: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
            });
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.fetchTypeList();
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props.form.resetFields();
            }
          });
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
          addType(params).then(res </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (res.code === 0<span style="color: rgba(0, 0, 0, 1)">) {
            message.info(</span>'新增成功'<span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
                visible: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
                isEdit: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
            });
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.fetchTypeList();
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props.form.resetFields();
            }
          });
      }
      }
    });
};

lookOrEditTypeModal </span>= (flag, record) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    const { articleType, mapType } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (flag === 'add') {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">添加默认为文章模板</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span>.marketId = articleType.length + 1;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置动态key标记长度</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
      visible: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
      row: { typeFields: articleType },
      });
    } </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (flag === 'edit'<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
      visible: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
      });
      getType({ dataTypeId: record.id }).then(res </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (res.code === 0<span style="color: rgba(0, 0, 0, 1)">) {
          </span><span style="color: rgba(0, 0, 255, 1)">this</span>.marketId = res.data.typeFields.length + 1;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置动态key标记长度</span>
          <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
            row: res.data,
            isEdit: flag </span>=== 'edit'<span style="color: rgba(0, 0, 0, 1)">,
          });
      }
      });
    } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
      lookVisible: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
      });
      getType({ dataTypeId: record.id }).then(res </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (res.code === 0<span style="color: rgba(0, 0, 0, 1)">) {
          </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
            row: res.data,
          });
      }
      });
    }
};
</span><span style="color: rgba(0, 0, 0, 1)">

onChangeType </span>= (value) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    const { form } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props;
    const { orderType, row, articleType, mapType } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
    </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props.form.resetFields();

    const params </span>=<span style="color: rgba(0, 0, 0, 1)"> {};
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (value === 1) {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">文章类型</span>
      params['typeFields'] =<span style="color: rgba(0, 0, 0, 1)"> articleType;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.marketId = articleType.length + 1<span style="color: rgba(0, 0, 0, 1)">;
    } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
      params[</span>'typeFields'] =<span style="color: rgba(0, 0, 0, 1)"> mapType;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.marketId = mapType.length + 1<span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
      row: params,
      orderType: value,
    });
};
//删除方法!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
removeFile </span>= k =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    const { form } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props;
    const keys </span>= form.getFieldValue('keys'<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (keys.length === 1<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    form.setFieldsValue({
      keys: keys.filter(key </span>=&gt; key !==<span style="color: rgba(0, 0, 0, 1)"> k),
    });
};
//添加方法!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
addFile </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    const { form } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props;
    const keys </span>= form.getFieldValue('keys'<span style="color: rgba(0, 0, 0, 1)">);
    const nextKeys </span>= keys.concat(<span style="color: rgba(0, 0, 255, 1)">this</span>.marketId++<span style="color: rgba(0, 0, 0, 1)">);
    form.setFieldsValue({
      keys: nextKeys,
    });
};

judgeIsTemplet </span>= (data) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">data) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((data.fieldName === 'lat') || (data.fieldName === 'lon') || (data.fieldName === 'label') || (data.fieldName === 'name'<span style="color: rgba(0, 0, 0, 1)">)) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    }
};</span><span style="color: rgba(0, 0, 0, 1)">
handleValidator </span>= (rule, val, callback) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">val) {
      callback();
    }
    let validateResult </span>= /^+$/<span style="color: rgba(0, 0, 0, 1)">.test(val);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">validateResult) {
      callback(</span>'请输入正确表字段'<span style="color: rgba(0, 0, 0, 1)">);
    }
    callback();
};

columns </span>=<span style="color: rgba(0, 0, 0, 1)"> [
    {
      title: </span>'类型名称'<span style="color: rgba(0, 0, 0, 1)">,
      dataIndex: </span>'name'<span style="color: rgba(0, 0, 0, 1)">,
      key: </span>'name'<span style="color: rgba(0, 0, 0, 1)">,
      width: </span>500<span style="color: rgba(0, 0, 0, 1)">,
    },
    {
      title: </span>'所属类型'<span style="color: rgba(0, 0, 0, 1)">,
      dataIndex: </span>'type'<span style="color: rgba(0, 0, 0, 1)">,
      key: </span>'type'<span style="color: rgba(0, 0, 0, 1)">,
      render: (text) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> text === 1 ? '文章' : '地图'<span style="color: rgba(0, 0, 0, 1)">;
      },
    },
    {
      title: </span>'操作'<span style="color: rgba(0, 0, 0, 1)">,
      dataIndex: </span>'address'<span style="color: rgba(0, 0, 0, 1)">,
      key: </span>'address'<span style="color: rgba(0, 0, 0, 1)">,
      render: (text, record) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> &lt;div&gt;
          &lt;Button type='link' onClick={() =&gt; <span style="color: rgba(0, 0, 255, 1)">this</span>.lookOrEditTypeModal('look', record)}&gt;查看&lt;/Button&gt;
          &lt;Button type='link' onClick={() =&gt; <span style="color: rgba(0, 0, 255, 1)">this</span>.lookOrEditTypeModal('edit', record)}&gt;编辑&lt;/Button&gt;
          &lt;Popconfirm title="确认删除?" onConfirm={() =&gt; <span style="color: rgba(0, 0, 255, 1)">this</span>.deleteTypeClick(record)}&gt;
            &lt;Button type='link'&gt;删除&lt;/Button&gt;
          &lt;/Popconfirm&gt;
      &lt;/div&gt;;
<span style="color: rgba(0, 0, 0, 1)">      },
    },
];
</span><span style="color: rgba(0, 0, 0, 1)">
render() {
    const { selectType, typeLoading, mock, row, isEdit, typeList, keyWord, lookVisible } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
    const { getFieldDecorator, getFieldValue } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props.form;
    let typeFields </span>= row.typeFields ||<span style="color: rgba(0, 0, 0, 1)"> [];
    const initData </span>=<span style="color: rgba(0, 0, 0, 1)"> [];
    typeFields.forEach((item, index) </span>=&gt; {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据真实数据,设置默认keys数组</span>
<span style="color: rgba(0, 0, 0, 1)">      initData.push(index);
    });
    getFieldDecorator(</span>'keys', { initialValue: initData });<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">给表单增加keys字段,并设置默认值,这里编辑时候可以生成编辑回填的效果。</span>
    const keys = getFieldValue('keys'<span style="color: rgba(0, 0, 0, 1)">);
    const formItems </span>= keys.map((k) =&gt;<span style="color: rgba(0, 0, 0, 1)"> (
      </span>&lt;Row gutter={12} key={k} className={styles.form_row}&gt;
      &lt;FormItem label="字段" key={`fieldName_${k}`}&gt;<span style="color: rgba(0, 0, 0, 1)">
          {getFieldDecorator(`fieldName_${k}`, {
            initialValue: row.typeFields </span>? row.typeFields.fieldName : ''<span style="color: rgba(0, 0, 0, 1)">,
            validateTrigger: [</span>'onChange', 'onBlur'], <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">校验子节点值的时机</span>
<span style="color: rgba(0, 0, 0, 1)">            rules: [{
            required: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
            message: </span>'请输入英文字段!'<span style="color: rgba(0, 0, 0, 1)">,
            }, {
            validator: </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.handleValidator,
            }],
          })(</span>&lt;Input placeholder="请输入英文字段" max={30} disabled={<span style="color: rgba(0, 0, 255, 1)">this</span>.judgeIsTemplet(row.typeFields)}/&gt;)}
      &lt;/FormItem&gt;
      &lt;FormItem label="名称" key={`remarks_${k}`}&gt;<span style="color: rgba(0, 0, 0, 1)">
          {getFieldDecorator(`remarks_${k}`, {
            initialValue: row.typeFields </span>? row.typeFields.remarks : ''<span style="color: rgba(0, 0, 0, 1)">,
            validateTrigger: [</span>'onChange', 'onBlur'<span style="color: rgba(0, 0, 0, 1)">],
            rules: [{
            required: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
            message: </span>'请输入中文名称!'<span style="color: rgba(0, 0, 0, 1)">,
            }],
          })(</span>&lt;Input placeholder="请输入中文名称" disabled={<span style="color: rgba(0, 0, 255, 1)">this</span>.judgeIsTemplet(row.typeFields)}/&gt;)}
      &lt;/FormItem&gt;
      &lt;FormItem label="排序" key={`order_${k}`}&gt;<span style="color: rgba(0, 0, 0, 1)">
          {getFieldDecorator(`order_${k}`, {
            initialValue: row.typeFields </span>? row.typeFields.order : 0<span style="color: rgba(0, 0, 0, 1)">,
          })(</span>&lt;InputNumber style={{width:75}} placeholder="排序" /&gt;)}
      &lt;/FormItem&gt;
      &lt;FormItem label="图片" key={k}&gt;<span style="color: rgba(0, 0, 0, 1)">
          {getFieldDecorator(`isImg_${k}`, {
            initialValue: row.typeFields </span>? row.typeFields.isImg : 0<span style="color: rgba(0, 0, 0, 1)">,
            rules: [{
            required: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
            }],
          })(</span>&lt;Radio.Group disabled={<span style="color: rgba(0, 0, 255, 1)">this</span>.judgeIsTemplet(row.typeFields)}&gt;
            &lt;Radio value={0}&gt;否&lt;/Radio&gt;
            &lt;Radio value={1}&gt;是&lt;/Radio&gt;
          &lt;/Radio.Group&gt;)}
      &lt;/FormItem&gt;
      {!<span style="color: rgba(0, 0, 255, 1)">this</span>.judgeIsTemplet(row.typeFields) ?<span style="color: rgba(0, 0, 0, 1)"> (
          </span>&lt;Icon type="minus-circle" onClick={() =&gt; <span style="color: rgba(0, 0, 255, 1)">this</span>.removeFile(k)} title='删除'/&gt;
      ) : <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">}
      </span>&lt;/Row&gt;
<span style="color: rgba(0, 0, 0, 1)">    ));


    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
      </span>&lt;div className={styles.wrap_type}&gt;
      &lt;<span style="color: rgba(0, 0, 0, 1)">Modal
          title</span>="类型管理"<span style="color: rgba(0, 0, 0, 1)">
          visible</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.visible}
          onOk</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.handleOk}
          onCancel</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.handleCancel}
          width</span>={890<span style="color: rgba(0, 0, 0, 1)">}
          </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> className={styles.modal_type}</span>
          maskClosable={<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">}
      </span>&gt;
          &lt;Form layout='inline'&gt;
            &lt;Row style={{ textAlign: 'center', marginBottom: 14 }}&gt;
            &lt;FormItem label="选择类型"&gt;<span style="color: rgba(0, 0, 0, 1)">
                {getFieldDecorator(</span>'type'<span style="color: rgba(0, 0, 0, 1)">, {
                  initialValue: row.dataType </span>? row.dataType.type : 1<span style="color: rgba(0, 0, 0, 1)">,
                  rules: [{
                  required: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
                  }],
                })(</span>&lt;Select onChange={<span style="color: rgba(0, 0, 255, 1)">this</span>.onChangeType} disabled={isEdit} style={{ width: 200 }}&gt;
                  &lt;Option value={1}&gt;文章类型&lt;/Option&gt;
                  &lt;Option value={2}&gt;地图类型&lt;/Option&gt;
                  &lt;Option value={3} disabled={<span style="color: rgba(0, 0, 255, 1)">true</span>}&gt;文件类型&lt;/Option&gt;
                &lt;/Select&gt;)}
            &lt;/FormItem&gt;
            &lt;FormItem label="类型名称"&gt;<span style="color: rgba(0, 0, 0, 1)">
                {getFieldDecorator(</span>'name'<span style="color: rgba(0, 0, 0, 1)">, {
                  initialValue: row.dataType </span>? row.dataType.name : ''<span style="color: rgba(0, 0, 0, 1)">,
                  rules: [{
                  required: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
                  message: </span>'请输入类型名称!'<span style="color: rgba(0, 0, 0, 1)">,
                  }],
                })(</span>&lt;Input placeholder="请输入类型名称" style={{ width: 200 }}/&gt;)}
            &lt;/FormItem&gt;
            &lt;/Row&gt;
<span style="color: rgba(0, 0, 0, 1)">            {formItems}
            </span>&lt;div style={{ margin: 'auto', textAlign: 'center' }}&gt;
            &lt;Button icon="plus" onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.addFile} style={{ marginTop: 10 }}&gt;新增字段&lt;/Button&gt;
            &lt;/div&gt;
          &lt;/Form&gt;
      &lt;/Modal&gt;
      &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">    );
}
}

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Index;</pre>
</div>
<p>关键地方是设置一个marketID作为动态添加的key,然后用他的值作为动态key。(千万不要用数组的下标index来作为key)!</p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    不要说我不会,要说我可以学<br><br>
来源:https://www.cnblogs.com/seemoon/p/13594502.html
頁: [1]
查看完整版本: react antd动态增减表单