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> </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> </p>
<p> </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) =><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>=><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 =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.props.form.validateFields((err, values) =><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>=><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>=><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) =><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>=><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>=><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) =><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 =><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>=> key !==<span style="color: rgba(0, 0, 0, 1)"> k),
});
};
//添加方法!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
addFile </span>= () =><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) =><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) =><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>=><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>=><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <div>
<Button type='link' onClick={() => <span style="color: rgba(0, 0, 255, 1)">this</span>.lookOrEditTypeModal('look', record)}>查看</Button>
<Button type='link' onClick={() => <span style="color: rgba(0, 0, 255, 1)">this</span>.lookOrEditTypeModal('edit', record)}>编辑</Button>
<Popconfirm title="确认删除?" onConfirm={() => <span style="color: rgba(0, 0, 255, 1)">this</span>.deleteTypeClick(record)}>
<Button type='link'>删除</Button>
</Popconfirm>
</div>;
<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>=> {<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) =><span style="color: rgba(0, 0, 0, 1)"> (
</span><Row gutter={12} key={k} className={styles.form_row}>
<FormItem label="字段" key={`fieldName_${k}`}><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><Input placeholder="请输入英文字段" max={30} disabled={<span style="color: rgba(0, 0, 255, 1)">this</span>.judgeIsTemplet(row.typeFields)}/>)}
</FormItem>
<FormItem label="名称" key={`remarks_${k}`}><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><Input placeholder="请输入中文名称" disabled={<span style="color: rgba(0, 0, 255, 1)">this</span>.judgeIsTemplet(row.typeFields)}/>)}
</FormItem>
<FormItem label="排序" key={`order_${k}`}><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><InputNumber style={{width:75}} placeholder="排序" />)}
</FormItem>
<FormItem label="图片" key={k}><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><Radio.Group disabled={<span style="color: rgba(0, 0, 255, 1)">this</span>.judgeIsTemplet(row.typeFields)}>
<Radio value={0}>否</Radio>
<Radio value={1}>是</Radio>
</Radio.Group>)}
</FormItem>
{!<span style="color: rgba(0, 0, 255, 1)">this</span>.judgeIsTemplet(row.typeFields) ?<span style="color: rgba(0, 0, 0, 1)"> (
</span><Icon type="minus-circle" onClick={() => <span style="color: rgba(0, 0, 255, 1)">this</span>.removeFile(k)} title='删除'/>
) : <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">}
</span></Row>
<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><div className={styles.wrap_type}>
<<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>>
<Form layout='inline'>
<Row style={{ textAlign: 'center', marginBottom: 14 }}>
<FormItem label="选择类型"><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><Select onChange={<span style="color: rgba(0, 0, 255, 1)">this</span>.onChangeType} disabled={isEdit} style={{ width: 200 }}>
<Option value={1}>文章类型</Option>
<Option value={2}>地图类型</Option>
<Option value={3} disabled={<span style="color: rgba(0, 0, 255, 1)">true</span>}>文件类型</Option>
</Select>)}
</FormItem>
<FormItem label="类型名称"><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><Input placeholder="请输入类型名称" style={{ width: 200 }}/>)}
</FormItem>
</Row>
<span style="color: rgba(0, 0, 0, 1)"> {formItems}
</span><div style={{ margin: 'auto', textAlign: 'center' }}>
<Button icon="plus" onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.addFile} style={{ marginTop: 10 }}>新增字段</Button>
</div>
</Form>
</Modal>
</div>
<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> </p>
</div>
<div id="MySignature" role="contentinfo">
不要说我不会,要说我可以学<br><br>
来源:https://www.cnblogs.com/seemoon/p/13594502.html
頁:
[1]