Vue中动态渲染表单并回显数据时,遇到input输入框因数据动态赋值再次输入而未渲染问题

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、效果如下:

保存后传给后端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值