ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

vue子父组件传引用类型

2020-06-22 22:37:03  阅读:400  来源: 互联网

标签:vue 子父 res 重置 productInfoTmp productInfo 复制 组件


【问题】

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

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

//-------------------------------------点击编辑按钮后的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时,采用引用类型深复制的方法

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
})

标签:vue,子父,res,重置,productInfoTmp,productInfo,复制,组件
来源: https://blog.csdn.net/make_1998/article/details/106877255

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有