在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端都适用),或者更细的统计网站每个页面的访问量,可以使用百度统计 百度统计传送门 按提示注册登录即可 登录后-->管理-->新增网站,配置 ...
随机推荐
- redis zincrby zadd 遇到的问题
在维护代理池时 报错1: zincrby(REDIS_KEY,proxy,-1)redis.exceptions.ResponseError: value is not a valid float 查 ...
- rdlc水晶报表在wpf里的使用
1引用程序集 Microsoft.ReportViewer.WinForms 2 xaml 命名空间 xmlns:rv="clr-namespace:Microsoft.Reporting. ...
- C#命名约定
推荐的标识命名风格 风格名称 描述 使用建议 示例 Pascal大小写 标识符中每个单词都首字母大写 用于类型名和成员名 CarDeck, DealersHand Camel大小写 除第一个单词以外, ...
- CRS-2800: Cannot start resource 'ora.asm' as it is already in the INTERMEDIATE state on server ‘RAC02’
在安装ORACLE RAC的Grid Infrastructure时,在节点1运行/u01/app/11.2.0/grid/root.sh正常,当在节点2运行/u01/app/11.2.0/grid/ ...
- 【备忘】WPF基础
XAML 为了避免生成用户界面(GUI)的代码和基于用户操作执行的代码混合在一起. 名称空间 值得注意的名称空间: xmlns="http://schemas.microsoft.com/w ...
- mysql远程表链接
FEDERATED简介 FEDERATED存储引擎是访问远程数据库中的表,在平时开发中可以用此特性来访问远程库中的参数表之类的,还是非常方便的.使用时直接在本地构建一个federated表来链接远程数 ...
- PHP网站开发方案
一. 开发成员 a)项目主管 b)页面美工c)页面开发 d)服务端程序开发e)系统与数据管理f)测试与版本控制 二. 网站组开发简明流程 三. 开发工具与环境 a) 服务器配置i. WEB服务器: F ...
- HTML连载11-HTML中被废弃的标签&字符实体
一.为什么会有被废弃的标签 答:HTML中以前存在一部分不是用来添加语义的标签,而与我们HTML标签是用来添加语义的,这与我们的定义不相符. 例如: 1.标签<br>:换行 2.标签&l ...
- mysql查询类型转换问题
mysql转换类型.类型转换.查询结果类型转换 一.问题来源 数据库一张表的主键id设为了自增,那就是int型的,但是其他表的关联字段又设置成了字符串! 而且已经开发了很久才发现问题,既然出现了问题肯 ...
- 移动端使用rem.js,解决rem.js 行内元素占位问题
父级元素: letter-spacing: -0.5em;font-size: 0; 子级元素: letter-spacing: normal; display: inline-block; vert ...