实战BUG!深拷贝浅拷贝的应用

265 阅读2分钟

前言:本人是个前端菜鸟,想通过写博客的方式来做笔记,记录自己在工作和学习中遇到的问题和答案

在开发公司的管理后台时(使用的是vue2+elementUI),编辑某个表格中的数据发现编辑页面的数据修改,表格中的数据也会修改,就算不请求后台,表格中的数据也会改变,只有刷新页面才能解决问题,这是一个比较严重的bug,所以经过我仔(疯)细(狂)思(百)考(度),终于找到了原因:

现象图文:

image.png

当我点击编辑时,是将后台获取到的某条数据通过插槽传入到另一个对象中,然后对该对象进行增删查改,思路大致没错,可是当我点击编辑并且修改后,发现:

image.png 此时我只是修改了表单内的数据,并没有提交,但是表格中的数据改变了

我把编辑窗口关闭,表格中的数据还是没有改变:

image.png

刷新窗口后:

image.png

数据又重新被赋值为后台返回的数据,说明在我点击编辑赋值的操作中是浅拷贝

image.png

查看代码和查阅资料后发现,scope赋值指向的是地址,也就是浅拷贝的操作,所以就算赋值后是修改表单中的对象,表格中的数据也会改变

image.png (a为表单对象)

所以应该用利用 JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象,不过此方法有局限性,它只适用于一般数据的拷贝(对象、数组)

修改后:

image.png

image.png

解决了该问题。

总结:对于深拷贝浅拷贝的了解太过局限,所以出现了比较低级的错误,所以,对于基础知识的理解还是非常有必要的,在工作中出现了这种问题不至于一头雾水,可以更快的解决bug,对于深浅拷贝的介绍因为本人能力有限,以后了解更详细后再写一篇博客记载