一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
今天来浅浅探讨一下,vue中深浅拷贝的问题。
最近在做项目的过程中,就遇到深浅拷贝的问题,我在数据传递的过程中,只是使用了'='传值(也就是浅拷贝),这就导致页面上数据的异常变动。
问题现象
就是这样的一个最常见的table,我们经常会对它进行数据的修改。修改如下:
然后错误的方法是,直接将行元素对象row直接用等号赋值给编辑框内的form的ref。这样的话,你在进行修改的过程中,就会出现,你一边在修改信息,外层table里的信息也在变动。如下:
解决办法
也就如何实现深拷贝的办法。查阅了资料之后,我们的实现方法如下:
state.detialForm = JSON.parse(JSON.stringify(row))
原理:用json.stringify()将对象或数组转化成json字符串,再用json.parse()把字符串转换成JavaScript对象。
这种方法虽然可以实现数组或对象深拷贝,但不能处理函数。
浅拷贝与深拷贝区别
深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。
深拷贝和浅拷贝的示意图大致如下:
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。