JS把对象push进数组后,前面的值被后面的值覆盖,动态增加表单并可折叠

JS把对象push进数组后,前面的值被后面的值覆盖

今天在push对象进数组的时候遇到一个问题,发现后面的值会覆盖前面的值,每太明白是怎么回事,然后就上网查了查

参考文章:https://blog.csdn.net/Wyatt_1/article/details/125892839
原因分析:

在把某个对象push进数组里的时候,需要注意对象定义的作用域,因为是在外面的定义的对象,所以每次该对象的地址是一样的,所以数组中保存的是该对象的地址,当最后一次给该对象赋值时,由于是同一个对象,所以最后一次给该对象赋值时会将前面的值给覆盖掉,其实第二次已经把第一次的值覆盖过了

  1. 每次循环都初始化一次,每次都是新的对象,对象指向的地址都不一样,这样就不会被覆盖了
for (let i = 0; i < 5; i++){
   let Obj={id:0};
   Obj.id= k;
   Array.push(Obj);
}
  1. 将对象转换为Json格式后再push数组中
    array.push(JSON.parse(JSON.stringify(Obj)))

动态增加表单并可折叠

可折叠效果就是用的 uView 的 u-collapse 组件实现

这里的大概逻辑就是循环一个数组,表单需要填写的值就在这个数组中,当我们新增一个表单时就去复制一份表单。然后push进循环的数组中就可以新增一个表单了

因为有多个表单所以要注意表单的名字是不一样的,也是动态的

<u-collapse class="collapseStyle">
	<u-collapse-item @change="handleCollapse($event, index)" class="itemStyle" :title="'套餐' + (index + 1)"
	  v-for="(item, index) in skus" :key="index">
		<u-form label-width="200rpx" :ref="'skuForm' + (index + 1)" :model="item">
			<u-form-item label="型号" prop="spuData" required >
				<u-input v-model="item.spuData"></u-input>
			</u-form-item>
			<u-form-item label="描述" prop="skuData"  required>
				<u-input v-model="item.skuData"></u-input>
			</u-form-item>
			<view class="flex justify-center aligns-center">
				<view class="shop-delete-btn" @click="handleBrandDelete(index)">删除</view>
			</view>
		</u-form>
	</u-collapse-item>
</u-collapse>
<view class="formBtn" @click="handleAddBrand">
	<text style="margin-left: 22rpx">新增</text>
</view>
<script lang="ts">
import { Vue, Component } from 'vue-property-decorator';

const skuRules = {
	spuData: [
		{
			required: true,
			message: '请输入型号',
			trigger: ['change', 'blur']
		}
	],
	skuData: [
		{
			required: true,
			message: '请输入对该型号的描述',
			trigger: ['change', 'blur']
		}
	],
}
export default class release extends Vue {
	private defaultSkus = {
		spuData:'',
		skuData:''
	}
	private skus=[
		{
			spuData:'',
			skuData:''
		}
	]
		
	handleCollapse(obj: { index: number; show: boolean }, index: number) {
		this.form.skus[index].collapsed = !obj.show;
	}
	
	handleBrandDelete(index: number) {
		this.form.skus.splice(index, 1);
	}
	
	handleAddBrand() {
	  const brand = this.$util.deepClone(this.defaultSkus);
	  const index = this.skus.push(brand);
	  this.$forceUpdate();
	  this.addBrandRules(index);
	}
	
	addBrandRules(index: number = 1) {
	  this.$nextTick(() => {
	    (this.$refs['skuForm' + index] as any)[0].setRules(skuRules);
	  });
	}
	
	
}
</script>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值