【问题】
在进行子父组件传值时,使用对象进行了传值。发现重置功能不可用。点击重置功能毫无作用
![](https://img-blog.csdnimg.cn/20200620220014602.gif#pic_center)
下面来详细分析一下我的代码部分:
【父组件代码】
//-------------------------------------点击编辑按钮后的js代码-------------------------------------------
this.title = "编辑产品"//抽屉的标题
//根据产品ID查询对应产品信息
this.$http.get(getProductInfoById+productId).then(res=>{
this.productInfo=res.data//传输到子组件的产品数据
this.productInfoTmp=res.data//传输到子组件作为重置的临时数据
})
//-------------------------------------父组件中引用子组件的代码-------------------------------------------
<product-drawer
:productInfo="productInfo"
:productInfoTmp="productInfoTmp"
:title="title"
:visible.sync="drawerVisible"
></product-drawer>
【子组件代码】
//-------------------------------子组件中父组件传输过来的数据的props代码-------------------------------------------
visible: {//抽屉的显示与隐藏
type: Boolean,
default: false
},
title: {//抽屉的标题
type: String,
default: ''
},
productInfo: {//产品信息
type: Object,
default: function () {
return {}
}
},
productInfoTmp: {//作为重置的产品信息
type: Object,
default: function () {
return {}
}
}
//-------------------------------子组件中的重置按钮代码-------------------------------------------
resetForm() {
this.productInfo=this.productInfoTmp
//this.$emit('update:visible', false);
}
【问题分析】
从子组件的props设置可以看出, productInfo和 productInfoTmp都是Object对象,那么这个就是引用类型。
简单描述一下引用类型复制的特点:
引用类型:把值和地址想成比作面包和面包存放的地址。
复制引用类型的浅复制:A拥有面包和面包的地址,然后将A复制给B,那么B只是知道了面包存放的地址。
复制引用类型的深复制:将A复制给B,不仅有了地址,而且B还有了自己的面包。
所以我们上面的就是引用类型的浅复制,将http的get请求的数据获取后,复制给了productInfo和 productInfoTmp,然后在子组件中使用,这个时候我们只是对同一个地址的同一个面包进行修改,所以对 productInfo修改后,productInfoTmp也和productInfo保持一致。所以上述的重置并不是没有运行,而且重置后还是一样的值。
【解决方案】
将查询结果赋值给productInfoTmp时,采用引用类型深复制的方法
扫描二维码关注公众号,回复:
11340959 查看本文章
![](/qrcode.jpg)
this.title = "编辑产品"//抽屉的标题
//根据产品ID查询对应产品信息
this.$http.get(getProductInfoById+productId).then(res=>{
this.productInfo=res.data
this.productInfoTmp.name=res.data.name
this.productInfoTmp.description=res.data.description
this.productInfoTmp.remark=res.data.remark
})