vue子父组件传引用类型

【问题】

在进行子父组件传值时,使用对象进行了传值。发现重置功能不可用。点击重置功能毫无作用

下面来详细分析一下我的代码部分:
【父组件代码】

//-------------------------------------点击编辑按钮后的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 查看本文章
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
})

猜你喜欢

转载自blog.csdn.net/make_1998/article/details/106877255