先来复习一下什么是深拷贝和浅拷贝:
浅拷贝:只复制一层对象,当对象的属性是引用类型时,实质上复制的是其引用,当引用指向的值发生变化时,原对象的属性值也会跟着变化,互相影响

深拷贝:在拷贝的时候,创建新的对象,并把原对象所有的属性都深拷贝到新对象,原属性如果是对象,也会重新创建新的对象并拷贝到新对象属性中,这样旧对象和新对象就是互相独立的,互不影响。【默认情况下基本数据类型(number,string,null,undefined,boolean)都是深拷贝。】

简单理解就是:浅拷贝复制的是对象的引用地址,没有开辟新的栈,复制的结果是两个对象指向同一个地址,所以修改其中一个对象的属性,另一个对象的属性也跟着改变了。
深拷贝会开辟新的栈,两个对象对应两个不同的地址,修改对象A的属性,并不会影响到对象B

数组浅拷贝解决方案

  1. 使用slice()
  2. 使用concat()
  3. ES6扩展运算符
  4. Array.form()

对象浅拷贝解决方案
用 JSON.stringify 把对象转换成字符串,再用JSON.parse把字符串转换成新的对象,但如果对象中包含 function 或 RegExp 则不能用这种方法。

vue中遇到的深拷贝和浅拷贝的问题
这里是把原来的数据变成字符串类型

for(var i in this.tablerow){
    this.tablerow[i] = this.tablerow[i].toString();
}

但这样只是一层浅拷贝,当对话框里的内容改变时,表单里也会跟着改变。
在这里插入图片描述
在这里插入图片描述
解决:使用vue里的$set方法来实现深拷贝,这时对话框里的内容改变就不会影响到表单内容了

 // 浅拷贝变为深拷贝
 var json = {};
  for(var i in this.tablerow){
      this.$set(json,i,this.tablerow[i].toString());
  }
  this.form = json;

在这里插入图片描述

Logo

前往低代码交流专区

更多推荐