在vue项目中遇到关于对象的深浅拷贝问题
一、问题描述
项目里新添加了一个多选的功能,其显示的数据都是从后端返回过来的,通过for循环显示出来。我们需要在返回来的数据外再额外添加一个是否选中的标记,我的选择是在返回正确的数据时将是都选择的标记添加进去,然后push到数组中。
在测试的时候出现了bug,即任意勾选其中一条数据都会导致其他的数据一起被勾选,而且其他显示的内容如果改变了,也会全部改变。原本以为是select选择器写的有问题,就把数据全部改成了测试的固定数据,发现并不会出现问题,才开始怀疑是不是由于所有的数据都指向同一个内存导致的。


二、问题代码
<!--通过循环数组将返回来的对象显示出来-->
<template v-for="(list, index ) in prodCategoryListShow">
<showdiv
:key="index"
:iskey="index"
@click="del"
:prodCategory="list.prodCategory"
:prodType="list.prodType"
:level="list.level"
:period="list.period"
:reftRate="list.reftRate"
:isChecked="list.isChecked"
></showdiv>
</template>
错误代码:
//在data中定义对象
data () {
return {
prodCategoryOneShow: {}
}
}
//请求回来后判断是否成功,成功后将数据放入data中定义的对象里
if (res.data.resCode === AjaxReturnState.success) {
this.prodCategoryOneShow.prodCategory = res.data.data.prodCategory;
this.prodCategoryOneShow.prodType = res.data.data.prodType;
this.prodCategoryOneShow.level = res.data.data.level;
this.prodCategoryOneShow.period = res.data.data.period;
this.prodCategoryOneShow.reftRate = res.data.data.reftRate;
//在对象里添加是否选中的标志isChecked,一进去默认未选中
this.prodCategoryOneShow.isChecked = false;
//将每次请求回来的一个对象添加到数组里
this.prodCategoryListShow.push(this.prodCategoryOneShow);
}
错误分析:每一次请求后,我将得到的对象属性的值一条一条塞进prodCategoryOneShow对象里。由于拿到是基本类型,将基本类型的值一条一条的放入对象里,这样导致的结果是,我每一次请求后塞进的prodCategoryOneShow对象都指向的是同一个内存地址,而且数据都是一样的(地址指向即第一次在data中申明的prodCategoryListShow的内存)。所以,我对数组里的任何一个对象进行操作,都会影响到其他的对象的内容。
三、解决方案
if (res.data.resCode === AjaxReturnState.success) {
//直接将请求回来的数据赋值给data里的对象
this.prodCategoryOneShow = res.data.data;
this.prodCategoryOneShow.isChecked = false;
this.prodCategoryListShow.push(this.prodCategoryOneShow);
}
这样子修改后,每一次请求成功后,将data对象简单赋值给prodCategoryOneShow,prodCategoryOneShow的内存地址指向和data保持一致。因为每一次请求后得到的对象(res.data.data)地址指向都不同,所以将其赋值给data中的对象,每一次的值西也不同,继而对数组中的对象任意对象操作不会影响到其他对象。
四、其他方案
对象间的赋值(深拷贝)
obj1=JSON.parse(JSON.stringify(obj2));
首先将obj2对象利用JSON.stringify()方法转换成字符串去掉对象属性,再使用JSON.parse()方法转换成对象赋值;
其作用是避免对象直接赋值造成指向相同地址以至于相互影响的问题。
在vue项目中遇到关于对象的深浅拷贝问题的更多相关文章
- 关于python中一切皆对象和深浅拷贝
- vue 项目中实用的小技巧
# 在Vue 项目中引入Bootstrap 有时在vue项目中会根据需求引入Bootstrap,而Bootstrap又是依赖于jQuery的,在使用npm按照时,可能会出现一系列的错误 1.安装jQu ...
- 如何在VUE项目中添加ESLint
如何在VUE项目中添加ESLint 1. 首先在项目的根目录下 新建 .eslintrc.js文件,其配置规则可以如下:(自己小整理了一份),所有的代码如下: // https://eslint.or ...
- vue项目中遇到的那些事。
前言 有好几天没更新文章了.这段实际忙着做了一个vue的项目,从 19 天前开始,到今天刚好 20 天,独立完成. 做vue项目做这个项目一方面能为工作做一些准备,一方面也精进一下技术. 技术栈:vu ...
- 在vue项目中使用axios发送FormData
这个是axios的中文文档,挺详细的: https://www.kancloud.cn/luponu/axios/873153 文档中的 使用 application/x-www-form-ur ...
- vue项目中postcss-pxtorem的使用及webpack中的配置 css中单位px和em,rem的区别
移动手机版要求我们在制作嵌入h5的时候去适配不同的手机.适配有多重模式,有flex.百分比等.字体大小的控制也有px.百分比.rem等单位,webpack中 px转rem. vue项目中postcss ...
- 在vue项目中使用canvas-nest.js,报parameter 1 is not of type 'Element'
canvas-nest.js是一款轻量的网页特效,如图: github地址:https://github.com/hustcc/canvas-nest.js 在普通的html项目中,只要将<sc ...
- vue项目中遇到的一些问题
或访问:https://github.com/littleHiuman/experiences-about-vue 欢迎补充! vuex 状态 vue-cli 命令行 vue vue vue-rou ...
- vue项目中使用百度统计
统计有多少人访问了自己的网站(wap端pc web端都适用),或者更细的统计网站每个页面的访问量,可以使用百度统计 百度统计传送门 按提示注册登录即可 登录后-->管理-->新增网站,配置 ...
随机推荐
- 【转】关于在.Net开发中使用Sqlite的版本选择问题
如果一个.NET应用要自适应32位/64位系统,只需要在项目的“目标平台”设置为“Any CPU”.但是如果应用中使用了SQLite,情况就不同了. SQLite的.NET开发包来自是System.D ...
- Win8 Metro(C#)数字图像处理--2.67图像最大值滤波器
原文:Win8 Metro(C#)数字图像处理--2.67图像最大值滤波器 [函数名称] 最大值滤波器WriteableBitmap MaxFilterProcess(WriteableBi ...
- 【Linux】简单明了查看内存使用和ubuntu的版本号及位数
1.查看ubuntu的版本号:cat /etc/issue 2.查看系统是32位的还是64位:getconf LONG_BIT 3.查看内存使用 free free命令可以用来查看系统内存使用情况,- ...
- 自定义View相关的博客收藏
颜色: http://android.jobbole.com/83283/ 坐标: http://android.jobbole.com/83276/ 流程介绍: http://android.job ...
- Git的HTTP proxy设置方法
今天用git push代码到Github死活上不去,最后设置了Http代理才上去了,在这小记一下设置方法 1.依次打开:项目地址-->.git(可能要选择显示隐藏文件夹才能看到)-->co ...
- xgboost参数及调参
常规参数General Parameters booster[default=gbtree]:选择基分类器,可以是:gbtree,gblinear或者dart.gbtree和draf基于树模型,而gb ...
- Unicode 7.0.1中文支持非常好
简单测试了一下,7.0.1中文支持非常好.Delphi7下将UniConnection的useUnicode设置为False,Tokyo下设置为True,Charset空着即可. 问题要点:1.建数据 ...
- Markdown的选择
直击现场 我一直在思索用什么格式存储文档比较好.之前一直在用google docs,但是它的格式不公开,上传/下载的时候需要转换格式,转换的时候必然会丢失一些信息.于是后来想,那还是纯本文或者mark ...
- delphi xe5 中TMemo控件的应用——for android
TMemo中的两个方法: TMemo.Lines.Add(stringxxx);意思是向TMemo中增加字符串stringxxx: TMemo.Lines.Text :=stringxxx,意思是清空 ...
- delphi如何输出当前堆栈
想实现,输出当前运行的堆栈,有会的吗?给点思路 方法很多,参考: https://bitbucket.org/shadow_cs/delphi-leakcheck/ 的 https://bitbuck ...