在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端都适用),或者更细的统计网站每个页面的访问量,可以使用百度统计 百度统计传送门 按提示注册登录即可 登录后-->管理-->新增网站,配置 ...
随机推荐
- 数字证书原理 good
文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的管理, ...
- 【WPF】UI虚拟化之------自定义VirtualizingWrapPanel
原文:[WPF]UI虚拟化之------自定义VirtualizingWrapPanel 前言 前几天QA报了一个关于OOM的bug,在排查的过程中发现,ListBox控件中被塞入了过多的Item,而 ...
- UWP中String类型如何转换为Windows.UI.Color
原文:UWP中String类型如何转换为Windows.UI.Color 我在学习过程中遇到的,我保存主题色为string,但在我想让StatusBar随着主题色变化时发现没法使用. ThemeCol ...
- ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区 1 引言 1.1 读者定位 我们假设用户在阅读本指南前应已具备以下知识: · 熟悉W ...
- .net core 利用Selenium和PhantomJS后台生成EChart图片
1.引用 NuGet安装: Selenium.Support Selenium.WebDriver Selenium.WebDriver.PhantomJS.CrossPlatform (分布Lin ...
- .NET重思(三)-数组列表与数组的区别,栈集合和队列结合的区别
数组列表和数组十分相似,区别在于数组列表的容量是可以动态变化的,而数组的容量是固定的.数组即Array类,数组列表即ArrayList类,两者十分相似.不过,Array类在System命名空间下,Ar ...
- Qt官方开发环境生成的exe发布方式--使用windeployqt
Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行.因此 Qt 官方开发环境里自带了一个 ...
- SYN012型B码时统
SYN012型B码时统 产品概述 SYN012型B码时统是由西安同步电子科技有限公司精心设计.自行研发生产的一款通用性时统终端,内置高精度恒温晶振,接收GPS北斗双模卫星信号,10MHz外部参考 ...
- vue实现Excel文件的上传与下载
一.前言项目中使用到比较多的关于Excel的前端上传与下载,整理出来,以便后续使用或分析他人. 1.前端vue:模板下载与导入Excel 导入Excel封装了子组件,点击导入按钮可调用子组件,打开文件 ...
- 【webAssembly系列】webAssembly初探究竟
一.前言 自从JavaScript诞生开始,到现在开始变成流行的编程语言,背后的是web发展所推动的.web应用的变得更多更复杂,但是渐渐暴露出JavaScript的问题: (1)语法太灵活导致开发大 ...