一、问题描述

  项目里新添加了一个多选的功能,其显示的数据都是从后端返回过来的,通过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项目中遇到关于对象的深浅拷贝问题的更多相关文章

  1. 关于python中一切皆对象和深浅拷贝

  2. vue 项目中实用的小技巧

    # 在Vue 项目中引入Bootstrap 有时在vue项目中会根据需求引入Bootstrap,而Bootstrap又是依赖于jQuery的,在使用npm按照时,可能会出现一系列的错误 1.安装jQu ...

  3. 如何在VUE项目中添加ESLint

    如何在VUE项目中添加ESLint 1. 首先在项目的根目录下 新建 .eslintrc.js文件,其配置规则可以如下:(自己小整理了一份),所有的代码如下: // https://eslint.or ...

  4. vue项目中遇到的那些事。

    前言 有好几天没更新文章了.这段实际忙着做了一个vue的项目,从 19 天前开始,到今天刚好 20 天,独立完成. 做vue项目做这个项目一方面能为工作做一些准备,一方面也精进一下技术. 技术栈:vu ...

  5. 在vue项目中使用axios发送FormData

    这个是axios的中文文档,挺详细的: https://www.kancloud.cn/luponu/axios/873153 文档中的    使用 application/x-www-form-ur ...

  6. vue项目中postcss-pxtorem的使用及webpack中的配置 css中单位px和em,rem的区别

    移动手机版要求我们在制作嵌入h5的时候去适配不同的手机.适配有多重模式,有flex.百分比等.字体大小的控制也有px.百分比.rem等单位,webpack中 px转rem. vue项目中postcss ...

  7. 在vue项目中使用canvas-nest.js,报parameter 1 is not of type 'Element'

    canvas-nest.js是一款轻量的网页特效,如图: github地址:https://github.com/hustcc/canvas-nest.js 在普通的html项目中,只要将<sc ...

  8. vue项目中遇到的一些问题

    或访问:https://github.com/littleHiuman/experiences-about-vue  欢迎补充! vuex 状态 vue-cli 命令行 vue vue vue-rou ...

  9. vue项目中使用百度统计

    统计有多少人访问了自己的网站(wap端pc web端都适用),或者更细的统计网站每个页面的访问量,可以使用百度统计 百度统计传送门 按提示注册登录即可 登录后-->管理-->新增网站,配置 ...

随机推荐

  1. inno setup 打包说明

     [Setup] 这个段包含用于安装程序和卸载程序的全局设置 AppId:在注册表中唯一的项名称,安装完64位系统在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\M ...

  2. 无法删除 NTFS 盘上的文件或文件夹(对Windows文件的各种情况有比较详细的描述)

    简介 本文介绍您可能无法删除 NTFS 文件系统卷上的文件或文件夹的原因,以及如何分析造成此问题的不同原因从而解决此问题. 更多信息 注意:在内部,NTFS 将文件夹作为特殊类型的文件进行处理.因此, ...

  3. 正则表达式-Csharp

    原文:正则表达式-Csharp 学习笔记:正则表达式 一. 正则表达式 正则表达式(Regex)是用来进行文本处理的技术,是语言无关的,在几乎所有语言中都有实现. 一个正则表达式就是由普通的字符及特殊 ...

  4. java基础之super关键字

    一.在java里面,对于super关键字通常有两种用法: 1. 用在子类的构造方法里(初始化用),主要是调用父类的默认构造方法,如果父类有不止一个构造方法,可以通过super指定具体的构造函数,比如 ...

  5. FMX有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法(firemonkey messaging)

    看FMX代码,发现有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法.   早前,看过文章说TMessageManage ...

  6. ssh超时时间设置(设置ClientAliveInterval),附SSH超详细参数

    作者: daodaoliang 版本: V 0.0.1 日期: 2016年12月29日 0x00 OpenSSH 简介 OpenSSH是采用SSH协议实现的重要的远程连接工具,它对所有的数据进行加密以 ...

  7. Qt for Android之Hello World

    Qt for Android (Hello World APK 创建)Qt是跨平台的,如桌面.移动.嵌入式平台.Qt for Android可以在Android v2.3.3 (API level 1 ...

  8. 测试 Components 与 Controls 的区别(嵌套在Panel上的Edit,依然是Form1的Component)

    本例效果图: 代码文件: unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, ...

  9. 因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间

    导致你的问题的,应该有2种可能性: 1.存放你的primary文件组的磁盘,已经满了: use master--你的数据库名称 go --看看你的primary组里的文件 select ds.name ...

  10. IT职场初体验一

    自己学习计算机专业也算有两个年头了吧,对于这个刚刚IT入门的菜鸟,对IT职场充满了好奇和憧憬,本人大学也像很多大学生一样,进入计算机专业也不是自己最初想进入的专业,进入这个原本离自己有点遥远的行业,一 ...