1、我这边的需求是,form表单名字和input都是动态渲染的,如下html代码,
看el-col里面的formData这个函数就可以,formData是模拟的数据
let formData = [{
"createDept": "1002",
"createUser": "1711649820528259074",
"createTime": "2024-05-11 09:23:27",
"updateUser": -1,
"updateTime": "",
"status": 0,
"isDeleted": 0,
"tenantId": "",
"id": "1789103996464558081",
"datasetId": "1789103996095459330",
"dataItem": "名称",
"dataItemCode": "",
"dataTypeAndLength": "字符串型200汉字",
"collectionRequirement": "发电厂名称全称",
"taskId": null,
"propertiesId": "",
"coordinate": ""
},{
"createDept": "1002",
"createUser": "1711649820528259074",
"createTime": "2024-05-11 09:23:27",
"updateUser": -1,
"updateTime": "",
"status": 0,
"isDeleted": 0,
"tenantId": "",
"id": "1789103996464558082",
"datasetId": "1789103996095459330",
"dataItem": "分类码",
"dataItemCode": "",
"dataTypeAndLength": "数值型(10)",
"collectionRequirement": "",
"taskId": null,
"propertiesId": "",
"coordinate": ""
},{
"createDept": "1002",
"createUser": "1711649820528259074",
"createTime": "2024-05-11 09:23:27",
"updateUser": -1,
"updateTime": "",
"status": 0,
"isDeleted": 0,
"tenantId": "",
"id": "1789103996527472641",
"datasetId": "1789103996095459330",
"dataItem": "区域码",
"dataItemCode": "",
"dataTypeAndLength": "字符串型20汉字",
"collectionRequirement": "国家名称简称 + 一级行政区名称,如中国河南省。",
"taskId": null,
"propertiesId": "",
"coordinate": ""
},{
"createDept": "1002",
"createUser": "1711649820528259074",
"createTime": "2024-05-11 09:23:27",
"updateUser": -1,
"updateTime": "",
"status": 0,
"isDeleted": 0,
"tenantId": "",
"id": "1789103996535861250",
"datasetId": "1789103996095459330",
"dataItem": "顺序码",
"dataItemCode": "",
"dataTypeAndLength": "数值型(10)",
"collectionRequirement": "采集时由系统自动生成。",
"taskId": null,
"propertiesId": "",
"coordinate": ""
}]
2、html代码
<div class="right_box">
<div v-for="(t,i) in drawImgList" :key="i">
<el-form v-if="t.isCurrent" :model="t.form" ref="dialogForm" label-width="auto" label-position="top">
<el-row :gutter="20">
<el-col :span="12" v-for="(item, index) in formData" :key="index">
<el-form-item :label="index + 1 + '. ' + item.dataItem" :prop="item.id">
<el-input v-model="t.form[item.id]" clearable @input="modeChang($event)"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
3、回显代码 res.data有模拟假数据 可以看看
//通过id回显编辑数据
getDeptApi(){
let data = {
dataItemId: this.itemObject.id,
}
let that = this
AjaxUtil.tokenget(
"jmis-cloud/api/jmis-smartgis/aimDataItemDetails/list",
data,
(res) => {
if (res.success) {
that.$nextTick(()=>{
res.data.forEach((item) => {
that.formData.forEach((info) => {
if (item.dataStandardId === info.id) {
// 找到匹配项后,直接更新当前遍历的drawImgList中form的对应属性
that.drawImgList[0].form[info.id] = item.dataContent;
}
});
});
this.dialogVisible = true;
})
console.log('formData11',this.formData)
} else {
that.$alert(res.msg, "提示", {
type: 'error'
})
}
},
(err) => {
}
);
},
//模拟后端返回的值
res.data = [
{
"createDept": "1002",
"createUser": "1711649820528259074",
"createTime": "2024-05-16 09:52:59",
"updateUser": -1,
"updateTime": "",
"status": 0,
"isDeleted": 0,
"tenantId": "",
"id": "1790923367195492354",
"collectionTaskId": null,
"dataStandardId": "1790917823550341121",
"dataCategoryId": null,
"dataItemId": "1790923367036108802",
"indicatorName": "名称",
"dataContent": "大潭发电厂",
"materialName": "",
"sourceUnit": "维基百科",
"publicationTime": "",
"collectionUnit": "",
"collector": "",
"collectionTime": "2024-04-23 18:44:35",
"checker": "",
"modificationOpinion": "",
"modifier": ""
},
{
"createDept": "1002",
"createUser": "1711649820528259074",
"createTime": "2024-05-16 09:52:59",
"updateUser": -1,
"updateTime": "",
"status": 0,
"isDeleted": 0,
"tenantId": "",
"id": "1790923367195492355",
"collectionTaskId": null,
"dataStandardId": "1790917823571312641",
"dataCategoryId": null,
"dataItemId": "1790923367036108802",
"indicatorName": "分类码",
"dataContent": "220104",
"materialName": "",
"sourceUnit": "维基百科",
"publicationTime": "",
"collectionUnit": "",
"collector": "",
"collectionTime": "2024-04-23 18:44:35",
"checker": "",
"modificationOpinion": "",
"modifier": ""
},
]
4、input动态有值后,再次输入失效,数据改变但未及时渲染的问题;用this.$forceUpdate();重新更新视图
<el-input v-model="t.form[item.id]" clearable @input="modeChang($event)"></el-input>
//更新视图
modeChang(){
this.$forceUpdate();
},
5、完整代码 (从后端获取数据,到渲染,通过id回显,修改完后转给后端)
<div v-for="(t,i) in drawImgList" :key="i">
<el-form v-if="t.isCurrent" :model="t.form" ref="dialogForm" label-width="auto" label-position="top">
<el-row :gutter="20">
<el-col :span="12" v-for="(item, index) in formData" :key="index">
<el-form-item :label="index + 1 + '. ' + item.dataItem" :prop="item.id">
<el-input v-model="t.form[item.id]" clearable @input="modeChang($event)"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
getSelectData(value) {
let data = {
current: 1,
size: 100,
datasetId: '1789103996095459330',// //记得改value 1788162073167982594 1768534495678627842
}
AjaxUtil.tokenget(
"jmis-cloud/api/jmis-smartgis/aimCollectionStandards/page",
data,
(res) => {
if (res.success) {
this.formData = res.data.records
} else {
this.formData = []
}
},
(err) => {
this.formData = []
}
);
},
//编辑
getEdit(row){
this.type = row
this.drawImgList.push({
form:{},
isCurrent: true
})
//根据id去复现数据
this.getDeptApi()
},
//通过id回显编辑数据
getDeptApi(){
let data = {
dataItemId: this.itemObject.id,
}
let that = this
AjaxUtil.tokenget(
"jmis-cloud/api/jmis-smartgis/aimDataItemDetails/list",
data,
(res) => {
if (res.success) {
that.$nextTick(()=>{
res.data.forEach((item) => {
that.formData.forEach((info) => {
if (item.dataStandardId === info.id) {
// 找到匹配项后,直接更新当前遍历的drawImgList中form的对应属性
that.drawImgList[0].form[info.id] = item.dataContent;
}
});
});
this.dialogVisible = true;
})
console.log('formData11',this.formData)
} else {
that.$alert(res.msg, "提示", {
type: 'error'
})
}
},
(err) => {
}
);
},
//更新视图
modeChang(){
this.$forceUpdate();
},
//保存编辑form数据
submitFnForm(){
let aimDataItemsDetailVosList = [];
for(let i in this.drawImgList[0].form){
aimDataItemsDetailVosList.push({"inputId":i,"value":this.drawImgList[0].form[i]})
}
let params = {
// filePath:res.data,
// ...this.drawImgList[0].coordinate,
aimDataItemsDetailVos:aimDataItemsDetailVosList,
id:this.itemObject.id
}
// saveAimData
AjaxUtil.tokenpost(
"jmis-cloud/api/jmis-smartgis/aimDataItemDetails/updateAimData",
params,
(res) => {
if (res.success) {
this.$message.success('操作成功')
this.drawImgList.forEach(item => {
if(item.isCurrent){
item.form = {}
this.drawImgList.splice(item,1)
}
});
this.selectNameApi()
this.closeDialog()
} else {
that.$alert(res.msg, "提示", {
type: 'error'
})
}
},
(err) => {
}
);
},
6、效果如下:
保存后传给后端