解读vue项目中遇到的深拷贝浅拷贝问题
作者:oilpastell
这篇文章主要介绍了vue项目中遇到的深拷贝浅拷贝问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
vue项目的深拷贝浅拷贝问题
遇到的问题
使用element-ui修改表单文本框的数据时,无论确定还是取消,页面数据都在同步修改
原因:
复杂类型的赋值是浅拷贝,直接赋值 会导致双向修改
解决的方法:
将浅拷贝转换成深拷贝
解决思路:
先把该对象转成字符串(普通数据类型), 就没有引用类型的影响了。再转回对象使用。
转换方式 :
JSON.parse(JSON.stringify(对象))
这里简述下深拷贝浅拷贝的概念
浅拷贝: 将A对象赋值给B对象,修改B对象的属性和方法会影响到A对象的属性和方法。
深拷贝: 将A对象赋值给B对象,修改B对象的属性和方法不会影响到A对象的属性和方法。
vue深拷贝、浅拷贝的区别
1、浅拷贝
this.ProductionLineForm = { "produeLineName": "产线1", "departmentId": 1, "produceLineStatus": 0, "director": 5, "description": "测试产线", "keyCraftNodeId":1 } let productionLineForm = this.ProductionLineForm; productionLineForm.produeLineName = '修改名称' console.info('this.ProductionLineForm', this.ProductionLineForm)
查看原form的值:
2、深拷贝
使用JSON.parse(JSON.stringify(要拷贝的对象))。
JSON.stringify()对象转为串,JSON.parse()串转为对象,JSON操作是深拷贝操作。
this.ProductionLineForm = { "produeLineName": "产线1", "departmentId": 1, "produceLineStatus": 0, "director": 5, "description": "测试产线", "keyCraftNodeId": 1 } let productionLineForm = JSON.parse(JSON.stringify(this.ProductionLineForm)); productionLineForm.produeLineName = '修改名称' console.info('this.ProductionLineForm', this.ProductionLineForm)
查看原form的值:
对比发现,浅拷贝,在修改productionLineForm的参数时,原form也被修改。而深拷贝修改参数不会影响原form的值。
注意:
浅拷贝:新对象赋值,只是取的旧对象栈中的值,也就是引用对象的值
深拷贝:会在堆里边开辟一个空间,存放自己的对象值
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。